2016-07-09 11 views
3

私は、次の二つのクラス:私はwordFormに含まれていないだけで、それらの単語を返します。このコードを持ってLINQを使用して、子テーブルのプロパティに応じて取得する行を制限するにはどうすればよいですか?

public class Word 
{ 
    public System.Guid WordId { get; set; } // WordId (Primary key) 
    public string Name { get; set; } // Name (length: 20) 
    // Reverse navigation 
    public virtual System.Collections.Generic.ICollection<WordForm> WordForms { get; set; } // WordForm.FK_WordFormWord 
} 

public class WordForm 
{ 
    public System.Guid WordFormId { get; set; } // WordFormId (Primary key) 
    public System.Guid WordId { get; set; } // WordId 
    public int   SourceId { get; set; } // Source 
    public string Definition { get; set; } // Definition (length: 500) 
    // Foreign keys 
    public virtual Word Word { get; set; } // FK_WordFormWord 
} 

は:

var words = db.Words 
      .Where(w => !db.WordForms.Any(z => z.WordId == w.WordId)) 
      .AsNoTracking() 
      .ToList(); 

私はこれを変更するにはどうすればよいので、それはない単語を検索しますwordFormおよび言い換える2

のソースIDを有する

  • そこ単語houseだとそれがwordFormに1のソースIDを持っている場合、私は言葉

  • でこれを含めたいが言葉houseだとそれがwordFormに2のソースIDを持っている場合、私はしたくありません言葉でこれを含める

+0

WordFormsはWordの仮想プロパティなので、次のようなことはできません: var words = db.Words.WordForms.Where(x => x.SourceId == 2); –

+0

@RickySanchez - これを私の現在のLINQにどのように適合させることができるか教えてください。私はこれを追加しようとしましたが運がありません:.Where(w => db.WordForms.Where(x => x.SourceId == 2)) –

答えて

1

代替ソリューション:

1)2

HashSet<Guid> wordFromIdListWithNeededSourceId = 
      new HashSet<Guid> 
      (
       db.WordForms.Where(wf => wf.SourceId == 2) 
       .Select(wf => wf.WordId).Distinct() 
      ); 

2)上記

List<Word> words = db.Words 
    .Where(wf => !wordFromIdListWithNeededSourceId 
    .Contains(wf.WordId)).AsNoTracking() 
    .ToList(); 
から任意WordFormsを持たないすべての単語を取得し、ソースIDを持つWordFormsから全てWordIdsを取得
2

これが動作すればこれを試してください。

var words = db.Words 
      .Where(w => !db.WordForms.Any(z => z.WordId == w.WordId) && db.WordForms.Any(y => y.SourceId == 2)) 
      .AsNoTracking() 
      .ToList(); 

P.S私がコンパイルされ、チェックしていません!

+0

@SamanthaJ解決策が得られたら、答えとしてマークしてください。それはソリューションを共有plzの作品:) :)ありがとう!! – JDoshi

1

また、次のように試してみることもできます。これは読みやすいので好きです。

var words = db.Words 
      .Where(w => !db.WordForms.Any(z => z.WordId == w.WordId)) // Words that aren't in WordForms 
      .Where(w => db.WordForms.Any(x => x.SourceId == 2)) //Words with a Source Id of 8 
      .AsNoTracking() 
      .ToList(); 

私はそれをテストしなかったのでコンパイルするために少し変更する必要があるかもしれません。しかし、複数のWhereステートメントを使用する上記の例は正しい方向にあなたを得るはずです。

関連する問題