Linq Nhibernate Fetch/FetchMany/ThenFetch重复结果
我正在查询我的数据库。结构如下所示 国家1..M国家/地区 一, .. M 城市1..M城市规模 因此,每个国家有多个地区,每个城市有多个地区,一个国家有多个城市 我试图从数据库中检索一个城市。我想预先了解一下城市、乡村和乡村地区 为此,我执行以下查询:Linq Nhibernate Fetch/FetchMany/ThenFetch重复结果,linq,nhibernate,Linq,Nhibernate,我正在查询我的数据库。结构如下所示 国家1..M国家/地区 一, .. M 城市1..M城市规模 因此,每个国家有多个地区,每个城市有多个地区,一个国家有多个城市 我试图从数据库中检索一个城市。我想预先了解一下城市、乡村和乡村地区 为此,我执行以下查询: City city = Session.Query<City>() .Where(x => x.Id == id)
City city = Session.Query<City>()
.Where(x => x.Id == id)
.Fetch(c => c.Country)
.ThenFetch(c => c.CountryLocales)
.FetchMany(x => x.CityLocales)
.AsEnumerable()
.FirstOrDefault();
City=Session.Query()
.其中(x=>x.Id==Id)
.Fetch(c=>c.Country)
.ThenFetch(c=>c.CountryLocales)
.FetchMany(x=>x.citycales)
.可计算的()
.FirstOrDefault();
出于某种原因,我现在获得了CountryLocales和CityCales的两个重复记录(两次)
我该如何解决这个问题?您应该研究未来的方法。这使您可以执行许多feteches,而不会碰到此问题。您当前的查询正在返回您不想要的笛卡尔积。使用Future方法,您可以执行多个查询,每个查询使用一个Fetch,然后将其结果聚合在一起,从而得到所需的结果 可能是这样的:
var result = Session.Query<City>()
.Where(x => x.Id == id)
.Fetch(c => c.Country)
.ToFuture();
Session.Query<City>()
.Where(x => x.Id == id)
.Fetch(c => c.CountryLocales)
.ToFuture();
Session.Query<City>()
.Where(x => x.Id == id)
.Fetch(c => c.CityLocales)
.ToFuture();
// execute query
City city = result.AsEnumerable().FirstOrDefault();
var result=Session.Query()
.其中(x=>x.Id==Id)
.Fetch(c=>c.Country)
.ToFuture();
Session.Query()
.其中(x=>x.Id==Id)
.Fetch(c=>c.CountryLocales)
.ToFuture();
Session.Query()
.其中(x=>x.Id==Id)
.Fetch(c=>c.citycales)
.ToFuture();
//执行查询
城市=结果.AsEnumerable().FirstOrDefault();
更多信息,请查看此答案:我很困惑。。。。你知道为什么我的样品不起作用吗?这听起来很合乎逻辑,而您的示例需要花费更多的代码..现在甚至更多。下面的代码正是我想要的(我偶然发现了它)City City=cityRepository.GetAll().Where(x=>x.Id==Id).Fetch(c=>c.Country.FetchMany(x=>x.citycales).AsEnumerable().FirstOrDefault();请参阅我答案底部的链接,以了解为什么会出现重复记录。这是因为如果你点击链接,你会得到一个笛卡尔积。但这并不能解释为什么我在评论中粘贴的查询是有效的。。奇怪..我怀疑cityRepository.GetAll()只是从数据库中提取evey City,然后调用Where和Fetch方法。像NHProf这样的探查器会准确地向您显示生成了什么样的SQL。