C# 使用nhibernate,我如何构造一个需要最近50行的查询

C# 使用nhibernate,我如何构造一个需要最近50行的查询,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有一个名为orders的表和一个名为Last Update的列(以及一个具有LastUpdate属性的order对象)。我想使用nhibernate构造一个查询,以获取最后50行,这样我就不会去数据库获取所有内容,然后必须在应用程序中过滤结果 这在nhibernate是可能的。我正在尝试使用LINQ api,如果您使用的是标准,则使用SetMaxResults(50)并对日期时间进行降序排序。您可以使用SetMaxResults(50),尽管这取决于您想要的50行(最新?最早?最后?)您可能还

我有一个名为orders的表和一个名为Last Update的列(以及一个具有LastUpdate属性的order对象)。我想使用nhibernate构造一个查询,以获取最后50行,这样我就不会去数据库获取所有内容,然后必须在应用程序中过滤结果


这在nhibernate是可能的。我正在尝试使用LINQ api,如果您使用的是标准,则使用SetMaxResults(50)并对日期时间进行降序排序。

您可以使用
SetMaxResults(50)
,尽管这取决于您想要的50行(最新?最早?最后?)您可能还需要执行SortBy表达式。

以下是此查询的LINQ版本

var orders = session.Query<Order>()
    .OrderByDescending(x => x.LastUpdate)
    .Take(50);
var orders=session.Query()
.OrderByDescending(x=>x.LastUpdate)
.采取(50);
这是代码示例的屏幕截图

这是NHibernate Profiler的屏幕截图

var orders = session.Query<Linq>()
    .OrderByDescending(x => x.LastUpdate)
    .Take(50);

var orders=session.Query()
.OrderByDescending(x=>x.LastUpdate)
.采取(50);

在一般情况下,suggesing
LastUdate
可以使用Linq2SQL为空。您可以将扩展方法写入IQuerable:

public static partial class FooTable
{
    public static IQueryable<FooTable> LastUpdated(this IQueryable<FooTable> queryable, int count)
    {
        return queryable.Where(x => (x.LastUdate != null))
            .OrderByDescending(x => x.LastUdate)
            .Take(count);
    }
}
public静态部分类FooTable
{
公共静态IQueryable LastUpdated(此IQueryable可查询,整数计数)
{
返回queryable.Where(x=>(x.LastUdate!=null))
.OrderByDescending(x=>x.LastUdate)
.记(数);
}
}

您知道通过LINQ api是否可行吗?尝试过,但似乎没有在数据库级别进行过滤。当我运行nhibernate探查器时,我看到它返回了所有记录。我认为您需要session.Linq()nhibernate 3.0.0.4000,这为SQL server添加了一个TOP(50)。Linq()语法已被Query()替换。资料员即将到来的照片。。经过再次测试,现在似乎奏效了。有些东西可能被缓存了。