linq 和 nhibernate 返回相同类型的集合吗?
如果我设计我的数据库层以便可以在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
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.
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, andIList<T>
in NHibernate), but if you can force both LINQ-to-SQL and NHibernate to useIList<T>
orIEnumerable<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 usesEntitySet<T>
, just stick to theIList<T>
methods, and you'll be safe.Just watch out for lazy and eager loading differences of each framework.
如果封装数据库访问(例如使用存储库模式),则可以让存储库实现通用接口,并让方法返回您选择用作返回类型的类型,例如 IEnumerable(T) 或 IList(T)。
由于 IList(T) 实现了 IEnumerable(T),因此在这个方向上没有问题。 如果您有 IEnumerable(T),则可以使用 IEnumerable(T) 上的 ToList() 扩展方法来获取 List(T)。 IQueryable(T) 将 IEnumerable(T) 实现为 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: