2

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

国家 1..M CountryLocales

1 .. 米

城市 1..M CityLocales

所以,每个国家有多个地区,每个城市有多个地区,一个国家有多个城市。

我尝试从数据库中检索一个城市。我想预取城市语言环境、国家和国家语言环境。

为此,我执行此查询:

        City city = Session.Query<City>()
                          .Where(x => x.Id == id)
                          .Fetch(c => c.Country)
                          .ThenFetch(c => c.CountryLocales)
                          .FetchMany(x => x.CityLocales)
                          .AsEnumerable()
                          .FirstOrDefault();

出于某种原因,我现在得到 CountryLocales 和 CityLocales 的重复记录(都是两次)

我怎样才能解决这个问题?

4

1 回答 1

3

您应该研究 Future 方法。这使您可以执行许多 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();

查看此答案以获取更多信息:Multiple Fetches in linq to nhibernate

于 2013-06-12T14:03:00.463 回答