使用 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,那么我不想将其包含在单词中
如果它有效,请尝试此操作。
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
语句的示例应该可以让您朝着正确的方向前进。