使用 LINQ,如何根据子表属性限制检索的行

本文关键字:属性 检索 LINQ 何根 使用 | 更新日期: 2023-09-27 17:56:02

我有以下两个类:

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
}

我有这段代码,它只返回那些不在wordForm中的单词:

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

我如何更改它,以便它检索不在 wordForm 中且源 ID 为 2 的单词。

换句话说,

  • 如果有单词house并且它在wordForm中的SourceId为1,那么我想将其包含在单词中

  • 如果有一个单词house并且它在wordForm中的SourceId为2,那么我不想将其包含在单词中

使用 LINQ,如何根据子表属性限制检索的行

如果它有效,请尝试此操作。

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

附言我没有编译和检查!!

另一种解决方案:

1)从源ID为2的WordForms中获取所有WordId

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

您也可以尝试以下方法,我更喜欢这样做,因为它更容易阅读:

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语句的示例应该可以让您朝着正确的方向前进。