Nhibernate 将此方法从IList转换为IQueryable

Nhibernate 将此方法从IList转换为IQueryable,nhibernate,collections,Nhibernate,Collections,是否可以转换: 公共IList Get() { return Session.CreateCriteria(typeof(T)).List(); } 返回IQueryable IList和IQueryable之间有什么区别?考虑SQL和Linq时,最重要的一个方面是返回IList意味着查询已经执行。返回IQueryable将保留稍后延迟sql执行的选项(因此您可能会在此方法之外构建查询) 但是,只有在使用Linq to NHibernate提供程序时,NHibernate才会出现这种情况。SQL

是否可以转换:

公共IList Get() { return Session.CreateCriteria(typeof(T)).List(); }

返回IQueryable


IList和IQueryable之间有什么区别?

考虑SQL和Linq时,最重要的一个方面是返回IList意味着查询已经执行。返回IQueryable将保留稍后延迟sql执行的选项(因此您可能会在此方法之外构建查询)


但是,只有在使用Linq to NHibernate提供程序时,NHibernate才会出现这种情况。SQL语句的条件API未Linqified。因此,实际上,在本例中,返回IList或IQueryable没有显著差异。

考虑SQL和Linq时,最重要的一个方面是,返回IList意味着查询已经执行。返回IQueryable将保留稍后延迟sql执行的选项(因此您可能会在此方法之外构建查询)


但是,只有在使用Linq to NHibernate提供程序时,NHibernate才会出现这种情况。SQL语句的条件API未Linqified。因此,在这种情况下,实际返回IList或IQueryable没有显著差异。

可能的情况是返回IEnumerable,如下所示:

public IEnumerable<T> Get() 
{ 
    return Session.CreateCriteria(typeof(T)).Future<T>(); 
}
public IEnumerable Get()
{ 
return Session.CreateCriteria(typeof(T)).Future();
}
通过这种方式,您可以像使用LINQtoSQL一样执行延迟执行

有关未来方法的更多信息,请参阅:

您还可以通过返回ICriteria接口而不是IList来模拟IQueryable:

public ICriteria<T> Get() 
{ 
    return Session.CreateCriteria(typeof(T)); 
}
public ICriteria Get()
{ 
返回会话.CreateCriteria(typeof(T));
}

这样,您就可以开始在方法之外构建查询,并最终在需要时执行它。

可以返回如下IEnumerable:

public IEnumerable<T> Get() 
{ 
    return Session.CreateCriteria(typeof(T)).Future<T>(); 
}
public IEnumerable Get()
{ 
return Session.CreateCriteria(typeof(T)).Future();
}
通过这种方式,您可以像使用LINQtoSQL一样执行延迟执行

有关未来方法的更多信息,请参阅:

您还可以通过返回ICriteria接口而不是IList来模拟IQueryable:

public ICriteria<T> Get() 
{ 
    return Session.CreateCriteria(typeof(T)); 
}
public ICriteria Get()
{ 
返回会话.CreateCriteria(typeof(T));
}

这样,您就可以开始在方法之外构建查询,并最终在需要时执行它。

CreateCriteria返回什么?可以通过搜索列表或可查询列表来回答“IList和IQueryable之间的区别是什么”。你在用NHibernate Linq吗?我相信最新的代码允许您将Criteria语句转换为Linq语句。CreateCriteria返回什么?可以通过搜索列表或可查询列表来回答“IList和IQueryable之间的区别是什么”。你在用NHibernate Linq吗?我相信最新的代码可以让你把一个Criteria语句转换成一个Linq语句,这并不完全正确。Future()确实会延迟SQL的执行,以便将许多单独的SQL调用组合到一个多查询中(在受支持的数据库上)。这与Linq延迟执行完全不同。例如,您不能在方法之外添加Linq语句,例如where语句,并使其影响将发送到数据库的SQL。使用Future NHibernate将返回所表示的条件,然后Linq to Objects将过滤掉内存中额外的Where语句。也就是说,如果可能,您应该始终使用Future with Criteria,没有理由不使用它。只是不要期望itI的Linq到SQL功能必须在这一点上与您达成一致。Future()的用途不仅仅是组合查询。为此,CreateMultiQuery和CreateMultiCriteria做了大量工作。如果你仔细阅读Ayende的博客文章,他会说:“……它们基本上是一种将查询执行推迟到以后的方式……”未来主要是推迟执行,而不是合并查询(第二个好处)。我已经看到了它的工作并对其进行了测试,与Linq的延迟执行没有本质区别。这非常相似。关于像Linq一样附加where语句,NHinernate在Linq出现之前就已经存在了。例如,在代码执行的任何时候(甚至在方法之外)构造条件和添加where子句都会在查询最终执行时影响生成的SQL。因此,结合这两个标准(criteriaconstruction&Future()),我发现Linq2sql的工作方式及其延迟执行有许多相似之处。同样,这并不是完全不同。只要看看你链接的帖子中Ayende的评论就可以了。未来在本质上是多标准的包装。关键是延迟加载,以查看是否有其他数据库调用可以在多查询中组合。请注意,如果数据库不支持MultiQuery,Future将故障转移到标准db调用。这不完全正确。Future()确实会延迟SQL的执行,以便将许多单独的SQL调用组合到一个多查询中(在受支持的数据库上)。这与Linq延迟执行完全不同。例如,您不能在方法之外添加Linq语句,例如where语句,并使其影响将发送到数据库的SQL。使用Future NHibernate将返回所表示的条件,然后Linq to Objects将过滤掉内存中额外的Where语句。也就是说,如果可能,您应该始终使用Future with Criteria,没有理由不使用它。只是不要期望itI的Linq到SQL功能必须在这一点上与您达成一致。Future()的用途不仅仅是组合查询。为此,CreateMultiQuery和CreateMultiCriteria做了大量工作。如果你仔细阅读Ayende的博客文章,他会说:“……Th