linq和nhibernate是否返回相同类型的集合?
如果我设计数据库层以便在linq到sql或nhibernate实现之间交换它,那么我必须针对接口编写代码 这意味着linq和nhibernate之间的返回类型必须相同,即列表等linq和nhibernate是否返回相同类型的集合?,nhibernate,linq-to-sql,factory-pattern,Nhibernate,Linq To Sql,Factory Pattern,如果我设计数据库层以便在linq到sql或nhibernate实现之间交换它,那么我必须针对接口编写代码 这意味着linq和nhibernate之间的返回类型必须相同,即列表等 列表类型是否相同?NHibernate默认情况下为集合返回IList,不幸的是,许多linq表达式对它们不起作用。我不确定是否有办法更改NHibernate返回类型,因为我还没有真正研究过它。如果您封装数据库访问,例如使用存储库模式,您可以让存储库实现一个公共接口,并让方法返回您选择用作返回类型的类型,例如IEnumer
列表类型是否相同?NHibernate默认情况下为集合返回IList,不幸的是,许多linq表达式对它们不起作用。我不确定是否有办法更改NHibernate返回类型,因为我还没有真正研究过它。如果您封装数据库访问,例如使用存储库模式,您可以让存储库实现一个公共接口,并让方法返回您选择用作返回类型的类型,例如IEnumerable(t)或IList(T) 因为IList(T)实现IEnumerable(T),所以在这个方向上没有问题。如果您有IEnumerable(T),可以使用IEnumerable(T)上的ToList()扩展方法来获取列表(T)。IQueryable(T)将IEnumerable(T)实现为ToList(),在这种情况下也可以正常工作 大概是这样的:
public interface IFooRepository
{
IList<Foo> GetAll();
// ...
}
public class NHibernateFooRepository : IFooRepository
{
//...
public IList<Foo> GetAll()
{
return Session.CreateCriteria(typeof(Foo)).List<Foo>();
}
}
public class LinqToSqlFooRepository : IFooRepository
{
//...
public IList<Foo> GetAll()
{
var foos = from Foo f in context.Foos select f;
return foos.ToList();
}
}
公共接口IFooRepository
{
IList GetAll();
// ...
}
公共类NHibernateForepository:IFooRepository
{
//...
公共IList GetAll()
{
return Session.CreateCriteria(typeof(Foo)).List();
}
}
公共类LinqToSqlFooRepository:IFooRepository
{
//...
公共IList GetAll()
{
var foos=来自上下文中的Foo f。foos选择f;
返回foos.ToList();
}
}
IIRC,除非您想在不使用LINQ查询理解(使用存储库模式)的情况下使用db层,否则您应该查看LINQ to NHibernate;在这种情况下,您几乎需要针对IQueryable
结果编写代码,这在大多数情况下都应该是可翻译的。(尽管您确实应该预先测试这一点,因为每个提供程序在其LINQ支持方面都是不同的。)
但是,默认情况下,实体类型上的1-*关系可能不会共享相同的类型(在LINQ to SQL中通常是EntitySet
,在NHibernate中通常是IList
),但是如果您可以强制LINQ to SQL和NHibernate对此类关系使用IList
或IEnumerable
,那么这也应该起作用
如果只考虑编译时兼容性,那么只要坚持使用泛型集合类型,不同集合类型之间的区别就不会有太大问题。例如,如果您的NHibernate映射使用IList
并且LINQ-to-SQL使用EntitySet
,只需坚持使用IList
方法,您就安全了
只需注意每个框架的惰性和急切的加载差异。IMO您最好选择一个,而不是抽象出ORM。