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

如果我设计数据库层以便在linq到sql或nhibernate实现之间交换它,那么我必须针对接口编写代码

这意味着linq和nhibernate之间的返回类型必须相同,即列表等


列表类型是否相同?

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。