2017-06-26 8 views
0

私はかなり複雑なSQL文を結合しています。ここで私のコードはEFを使用しています:efエンティティで(linq?)を使用する

var MicrositeResponseAdors = _context.MicrositeResponseAdor 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.AddTradeIn) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.TrackingFinance) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.SearchTracking) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.TrackingType) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.Vehicle) 
    .FirstOrDefault(m => m.Id == id && m.FirstName.ToLower() != "test" && m.LastName.ToLower() != "test"); 

私はエンティティフレームワークが許可しない主キーを持たないテーブルに別の結合を追加する必要があります。私はそれを偽造することさえできませんでした。だから私はLINQと呼ばれるものを使って何かをより慣れさせるように言われましたか?

データ値に元のEFエンティティクラスを割り当てる方法がわかりません。

var MicrositeResponseAdors = (from p in _context.MicrositeResponseAdor 
    join c in _context.UserTracking on p.Id equals c.UserTrackingId 
    into pc 
    select new { 
     MicrositeResponseAdor = p, MicrositeResponseAdor.UserTracking = pc 
    } 
).FirstOrDefault(); 

これが与える:

無効な匿名型のメンバ宣言子をここに私はこれまで持っているものです。

私はMicrositeResponseAdor.UserTrackingの最初の部分のためだと思います。 MicrositeResponseAdorの下でUserTrackingを割り当てる方法がわかりません。

+0

ORMの結合は非常に強いにおいです。 ORMは*関係*を持つオブジェクト*を扱います。 ORMはデータベースではなく、LINQはSQLの代替品ではありません。 –

+0

MicroSiterResponseAdorクラスに別の*関係*を追加する必要があります。たぶん 'public UserTracking UserTracking {get; set;}'でしょう。 EFはテーブル、フィールドがそれらのように見える表記規則に従うと、関係を検出します。クエリはまったく変更する必要はありません –

+0

BTW投稿したEFコードに結合が表示されません。 *単一のエンティティの読み込みのみ。それらを「含む」は熱心な読み込みを強制しますが、結合とはまったく関係ありません。あなたは熱心な読み込みを必要としない場合でもそれらを取り除くことができます –

答えて

0

あなたが指定したエラーは、プロパティ名をMicrositeResponseAdor.UserTrackingにしようとしているので、C#コンパイルエラーです。プロパティ名にはドットを使用できません。

これは、少なくともコンパイルします:

var micrositeResponseAdor = (
    from p in _context.MicrositeResponseAdor 
    join c in _context.UserTracking on p.Id equals c.UserTrackingId into pc 
    select new { 
     MicrositeResponseAdor = p, 
     UserTracking = pc 
    } 
).FirstOrDefault(); 

これは、2つの場所にUserTrackingが表示され、あなたのようになります:

  1. micrositeResponseAdor.UserTracking
  2. micrositeResponseAdor.MicrositeResponseAdor.UserTracking

それは最初にいますので、そこに置いたとにかくエンティティ間に関係があるため、EFはそれをそのコンテキストにロードしていると便利です(そして、あなたが明示的にそれを求めたために)。

クエリにロードされたナビゲーションプロパティを割り当てる必要がないので、手動結合、Include、または2番目のクエリを使用して、関連するエンティティがロードされていることを確認するだけで済みます。

なぜこれを行うのはなぜですか。既にIncludeバージョンがあります。結合バリアントはもっと冗長ですが、何も追加しません。

EFは、データベースがそれを1つであるかどうかにかかわらず、常にすべてのエンティティに鍵を持ちます。技術的には、それは無関係ですInclude vs joinしかし。

関連する問題