2012-03-23 8 views
0

、私は次のテーブルを持っている:Entity Frameworkの - 複雑なクエリベストプラクティス多言語データベースで

  • エリア& AreaLocale:エリアは緯度/経度が含まれています/エリアID & AreaLocale含まれているID /名前/説明/エリアID/CultureId
  • 国& CountryLocale:国は、緯度/経度/ CountryId & CountryLocaleは、ID /名前/説明/ CountryId/CultureId
  • 文化が含まれて含まれています。ID /名前/表示名が含まれています
  • その結果、地域のIsDeleted = falseを、

    エリアID /名前/説明/経度/緯度/ CountryId /国名/ CultureId /文化の表示名:

は今、私が取得することで必要なものを次のようです。

次のクエリが書き込まれます。

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(); 

上記のクエリを書くのではなく参加使って、代わりにUnionAllを使用するより良い方法はありますか?

+0

モデルにナビゲーションプロパティがありません。たとえば、 'public ICollection AreaLocales {get;セット; } 'と' public Country Country {get;セット; } 'Area'クラスなどでは?これらを持っていれば、手書きの結合はまったく必要ありません。 – Slauma

+0

実際、私は次のようなことがあります:AreaのAreaLocalesのリスト、AreaエンティティのCountryプロパティ、CountryのCountryLocaleのList。上記と同じことを達成する方法は?ありがとうございました – Bill

答えて

1

あなたのコメントを参照のうえ: プロパティエリア実体上のエリアにAreaLocales、国のリスト、および国のCountryLocaleのリスト:実際には

、私は次のように持っています。

また、私は(あなたが明らかにAreaLocaleクラスのCultureId性質を持っているので)AreaLocaleCulture性質を持っていることを前提としています:

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(); 

結果オブジェクトは、2つのネストされたリスト4 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に変換され、必要なときには、結合を作成します。

+0

印象的な答えをありがとう。私は上記の詳細を理解しようとしています。上記のクエリは、エリアごとにAreaカラム+ AreaLocaleコレクションを返します。 CountryNamesについては、各エリアには1つの国があるので、CountryNamesには、Areaに接続されている単一の国のすべてのロケールが含まれると想定します。 EFの理解に役立つ資料、それに対してクエリを書く方法は?ありがとう – Bill

+0

もう1つの質問ですが、国と文化に基づいてデータを除外したい場合、AreaLocalesとCountryNamesに.Where()を追加しますか? – Bill

+0

@bhaidar:はい、あなたの最初のコメントの理解は正しいです。そして、最初の例では 'Where'を追加してサブオブジェクトをフィルタリングすることができますが、2番目の例(' Include'の内部)では追加することはできません。 EF 4.1の紹介はこちら:http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction-and- model.aspx – Slauma

関連する問題