如何使用 LINQ 创建类似联接的查询并检查子对象中的属性



我有两个对象:Word和WordForm。 它们与 WordId 链接在一起。下面是其中的数据示例:

Word id      Word id Wordformid     Sourceid
1                1     123            1
                 1     234            1
                 1     567            2
                 1     890            2
2                2     111            1
3                3     113            1
4                3     222            2

我想创建一个 LINQ 查询,它为我提供了所有没有具有特定 SourceID 的相应 WordForm 的单词。换句话说,一个可以给我的查询:

如果 SourceId 选择器为 1,那么它会给我4

如果 SourceId 选择器为 2,那么它会给我2 & 3

这是我到目前为止所拥有的:

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

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
}

所有没有具有特定源ID的相应WordForm的单词

假设你有Word w.以上可以这样翻译:

对应词形

db.WordForms.Where(wf => wf.WordId == w.WordId)

具有特定源 ID 的 WordForm

db.WordForms.Where(wf => wf.SourceId == SourceId)

具有特定源 ID 的相应 WordForm

db.WordForms.Where(wf => wf.WordId == w.WordId && wf.SourceId == SourceId)

没有具有特定源 ID 的相应 WordForm

!db.WordForms.Where(wf => wf.WordId == w.WordId && wf.SourceId == SourceId).Any()

或者干脆

!db.WordForms.Any(wf => wf.WordId == w.WordId && wf.SourceId == SourceId)

所以整个查询将是:

var words = db.Words
    .Where(w => !db.WordForms.Any(wf => wf.WordId == w.WordId && wf.SourceId == SourceId))
    .ToList();

相关内容

  • 没有找到相关文章