Linq Nhibernate Fetch/FetchMany/ThenFetch重复结果

Linq Nhibernate Fetch/FetchMany/ThenFetch重复结果,linq,nhibernate,Linq,Nhibernate,我正在查询我的数据库。结构如下所示 国家1..M国家/地区 一, .. M 城市1..M城市规模 因此,每个国家有多个地区,每个城市有多个地区,一个国家有多个城市 我试图从数据库中检索一个城市。我想预先了解一下城市、乡村和乡村地区 为此,我执行以下查询: City city = Session.Query<City>() .Where(x => x.Id == id)

我正在查询我的数据库。结构如下所示

国家1..M国家/地区

一, .. M

城市1..M城市规模

因此,每个国家有多个地区,每个城市有多个地区,一个国家有多个城市

我试图从数据库中检索一个城市。我想预先了解一下城市、乡村和乡村地区

为此,我执行以下查询:

        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。