linq 和 nhibernate 返回相同类型的集合吗?

发布于 2024-08-01 14:18:59 字数 138 浏览 4 评论 0原文

如果我设计我的数据库层以便可以在 linq-to-sql 或 nhibernate 实现之间交换它,我必须针对接口进行编码。

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

列表类型是否相同?

If I design my db layer so I can swap it between a linq-to-sql or nhibernate implementation, I have to code against an interface.

This means the return type between both linq and nhibernate have to be the same i.e. List etc.

Is the list type the same?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

九八野马 2024-08-08 14:18:59

NHibernate 默认为集合返回 IList,不幸的是,很多 linq 表达式对它们不起作用。 我不确定是否有办法改变 NHibernate 返回类型,因为我还没有真正研究过它。

NHibernate returns IList by default for collections, and a lot of linq expressions don't work on them, unfortunately. I'm not sure if there is a way of changing the NHibernate return type, as I haven't really looked into it.

一曲琵琶半遮面シ 2024-08-08 14:18:59

IIRC,除非您想在没有 LINQ 查询理解的情况下使用数据库层(使用存储库模式),否则您应该看看 LINQ to NHibernate; 在这种情况下,您几乎需要针对 IQueryable 结果进行编码,这在大多数情况下都应该可以翻译。 (尽管您应该预先测试这一点,因为每个提供程序的 LINQ 支持都不同。)

但是,实体类型上的 1-* 关系默认情况下可能不会共享相同的类型(通常是 EntitySet< /code> 在 LINQ-to-SQL 中,以及 IList 在 NHibernate 中),但如果您可以强制 LINQ-to-SQL 和 NHibernate 使用 IList code> 或 IEnumerable 对于此类关系,这也应该有效。

如果您只追求编译时兼容性,那么只要您坚持使用通用集合类型,各种集合类型之间的区别就不应该成为太大问题。 例如,如果您的 NHibernate 映射使用 IList 并且 LINQ-to-SQL 使用 EntitySet,则只需坚持 IList< /code> 方法,你就会安全了。

只需注意每个框架的延迟加载和急切加载差异即可。

IIRC, unless you'd want to use your db layer without LINQ query comprehensions (using the repository pattern), you should take a look at LINQ to NHibernate; in that case, you'd pretty much code against IQueryable<T> results, which should translate most of the time. (Though you should really test this upfront, because every provider is different in its LINQ support.)

However, 1-* relations on your entity types will probably not share the same type by default (it's usually EntitySet<T> in LINQ-to-SQL, and IList<T> in NHibernate), but if you can force both LINQ-to-SQL and NHibernate to use IList<T> or IEnumerable<T> for such relations, this should work as well.

If you're only after compile time compatibility, the distinction between the various collection types should not be much of a problem, as long as you stick to the generic ones. For instance, if your NHibernate mapping uses IList<T> and LINQ-to-SQL uses EntitySet<T>, just stick to the IList<T> methods, and you'll be safe.

Just watch out for lazy and eager loading differences of each framework.

﹉夏雨初晴づ 2024-08-08 14:18:59

如果封装数据库访问(例如使用存储库模式),则可以让存储库实现通用接口,并让方法返回您选择用作返回类型的类型,例如 IEnumerable(T) 或 IList(T)。

由于 IList(T) 实现了 IEnumerable(T),因此在这个方向上没有问题。 如果您有 IEnumerable(T),则可以使用 IEnumerable(T) 上的 ToList() 扩展方法来获取 List(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();
    }
}

If you encapsulate your database access, for example using the repository pattern, you could have the repositories implement a common interface and have the methods return the type you choose to use as return type, such as IEnumerable(T) or IList(T).

Since IList(T) implements IEnumerable(T) there is no problem in that direction. If you have an IEnumerable(T) you can use the ToList() extension method on IEnumerable(T) to get List(T). IQueryable(T) implements IEnumerable(T) to ToList() works fine in that case as well.

Something like this:

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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文