如何对表执行 EF 查询以仅在没有指向子表的链接时才显示结果

本文关键字:链接 结果 显示 执行 EF 查询 | 更新日期: 2023-09-27 17:56:09

我有以下两个类:

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 string Definition { get; set; } // Definition (length: 500)
    // Foreign keys
    public virtual Word Word { get; set; } // FK_WordFormWord
}
单词

表有一些单词具有匹配的单词窗体,有些单词没有。我需要的是获取没有相应单词形式的单词列表。

这是我到目前为止的代码。我知道如何添加一个简单的.我有这种需求的地方是我还没有看到该怎么做的事情:

   var words = db.Words
        .AsNoTracking()
        .ToList();

有人可以告诉我如何修改此代码以满足我的要求吗?

如何对表执行 EF 查询以仅在没有指向子表的链接时才显示结果

子查询应该有效:

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

您可以轻松获得没有像这样的WordForms Words

var words = db.Words
            .Where(W => W.WordForms.Count == 0)
            .ToList();

此代码有效,无需在任何语句中过滤!

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

另一种选择是使用左连接

var words = (from w in db.Words
             join wf in db.WordForms
                 on w.WordId equals wf.WordId into wwf
             from x in wwf.DefaultIfEmpty()
             where x == null
             select w)
             .AsNoTracking()
             .ToList();