Entity Framework - Лучшая практика сложных запросов - PullRequest
0 голосов
/ 23 марта 2012

В многоязычной базе данных у меня есть следующие таблицы:

  • Area & AreaLocale: область содержит широту / долготу / AreaId, а AreaLocale содержит идентификатор / имя / описание / AreaId / CultureId
  • Country & CountryLocale: Страна содержит Широту / Долготу / CountryId и CountryLocale содержит Id / Name / Description / CountryId / CultureId
  • Культура: содержит идентификатор / имя / отображаемое имя

Теперь мне нужно получить следующее:

AreaId / Name / Description / Долгота / Широта / CountryId / Название страны / CultureId / Культурное отображаемое имя, такое, что IsDeleted области = false.

Написан следующий запрос:

var q = (from areas in context.Areas
 join countries in context.Countries on areas.CountryId equals countries.CountryId
 join arealocales in context.AreaLocales on areas.AreaId equals arealocales.AreaId
 join cultures in context.Cultures on arealocales.CultureId equals cultures.CultureId
 join countrylocales in context.CountryLocales on areas.CountryId equals countrylocales.CountryId
 where areas.IsDeleted == false
 select new Area()
 {
      CountryId = areas.CountryId,
      CountryName = countrylocales.Name,
      CultureId = cultures.CultureId,
      CultureDisplayName = cultures.DisplayName,
                          Description = arealocales.Description,
      Id = areas.AreaId,
      Latitude = areas.Latitude,
      Longitude = areas.Longitude,
      Name = arealocales.Name
 }).ToList();

Есть ли лучший способ написания вышеуказанного запроса вместо использования Joins и использования UnionAll вместо этого?

1 Ответ

1 голос
/ 25 марта 2012

Ссылаясь на ваш комментарий:

На самом деле у меня есть следующее: Список AreaLocales по области, стране свойство объекта Area и список CountryLocale для Country.

Я также предполагаю, что AreaLocale имеет свойство Culture (поскольку у вас, очевидно, есть свойство CultureId в классе AreaLocale):

var q = (from area in context.Areas
         where area.IsDeleted == false
         select new   // or: select new SomeHelperClass
         {
             Id = area.AreaId,
             Latitude = area.Latitude,
             Longitude = area.Longitude,
             CountryId = area.CountryId,

             AreaLocales = area.AreaLocales.Select(areaLocale => new
             {
                 Description = areaLocale.Description,
                 Name = areaLocale.Name,
                 CultureId = areaLocale.Culture.CultureId,
                 CultureDisplayName = areaLocale.Culture.DisplayName
             }),

             CountryNames = area.Country.Countrylocales.Select(
                 countryLocale => countryLocale.Name)
         })
        .ToList();

Объекты результатов имеют два вложенных списка, четыре AreaLocales и CountryNames. Если в любом случае это почти все свойства классов, вы также можете просто использовать готовую загрузку:

var q = (from area in context.Areas
             .Include(a => a.AreaLocales.Select(al => al.Culture))
             .Include(a => a.Country.CountryLocales)
         where area.IsDeleted == false
         select area)
        .ToList();

Entity Framework создаст необходимые объединения, когда эти запросы LINQ будут переведены в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...