35 nhibernate linq-to-nhibernate queryover
我发现了2个类似的问题:
根据这个页面:
注意不要急于同时获取多个集合属性.虽然这个声明可以正常工作:
Run Code Online (Sandbox Code Playgroud)var employees = session.Query<Employee>() .Fetch(e => e.Subordinates) .Fetch(e => e.Orders).ToList();它对数据库执行笛卡尔积产品查询,因此返回的总行数将是总下属乘以总订单数.
可以说我有以下型号:
public class Person
{
public virtual int Id { get; private set; }
public virtual ICollection<Book> Books { get; set; }
public virtual ICollection<Article> Articles { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用QueryOver/Linq(不返回笛卡尔积),急切地使用书籍,文章和地址加载所有人的最简单方法是什么?
谢谢
更新:
见cremor的回答下面和弗洛里安林的回答在这个线程.以下代码很好地工作,只有一次往返数据库.
var persons = session.QueryOver<Person>()
.Future<Person>();
var persons2 = session.QueryOver<Person>()
.Fetch(x => x.Books).Eager
.Future<Person>();
var persons3 = session.QueryOver<Person>()
.Fetch(x => x.Articles).Eager
.Future<Person>();
var persons4 = session.QueryOver<Person>()
.Fetch(x => x.Addresses).Eager
.Future<Person>();
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我更喜欢使用 linq 提供程序,尤其是当您使用较新版本的 nhibernate (>= 4.0) 时。只要您将集合映射为 ISet(需要 .net 框架 >= 4),我们将其转换为这样我们就可以进行急切加载并避免笛卡尔积。我觉得这不是大肆宣传的东西,但我更喜欢这种适用于其他任何方法的方法:
public class Person
{
public virtual int Id { get; private set; }
public virtual ISet<Book> Books { get; set; }
public virtual ISet<Article> Articles { get; set; }
public virtual ISet<Address> Addresses { get; set; }
}
public Person()
{
this.Books = new HashSet<Book>();
this.Articles = new HashSet<Article>();
this.Addresses = new HashSet<Address>();
}
Run Code Online (Sandbox Code Playgroud)
如果您的集合定义如上,那么您可以执行以下操作并仍然避免笛卡尔积问题:
var persons = session.Query<Person>()
.FetchMany(x => x.Books)
.FetchMany(x => x.Articles)
.FetchMany(x => x.Addresses)
.ToList();
Run Code Online (Sandbox Code Playgroud)
小智 0
public IList<Person> GetAll()
{
var persons = session.QueryOver<Person>()
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Books).Eager
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Articles).Eager
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Addresses).Eager
.Future<Person>();
return persons.ToList();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19742 次 |
| 最近记录: |