簡體   English   中英

過濾Entity Framework查詢中的“包含”表

[英]Filter the “Includes” table on Entity Framework query

這適用於.NET 3.5的Entity Framework:

我需要查詢一個表並包含一對多關系的“多”表的集合。 我試圖過濾該集合作為查詢的一部分 - 我對Entity Framework很新,而且我很難搞清楚它。

簡化示例:作者擁有Books,而Book擁有IsFiction專欄。 我想要一個過濾的作者列表,以及所有小說書籍。

沒有過濾器,很容易:

var q = from a in db.Authors.Include("Books")
        where a.BirthYear > 1900
        select a;

我可以在事后過濾,例如:

var fictionBooks = a.Books.Where(b => b.IsFiction);

但問題是原始查詢已經運行,並包含那些結果,這是不必要的數據庫處理。

我可以單獨查詢,例如:

var q = from a in db.Authors where a.BirthYear > 1900 select a;
foreach (var a in q)
{
    var books = from b in db.Books 
                where ((b.Author.Id == a.Id) && (b.IsFiction))
                select b;
}

但當然這是每個作者的一個電話,我也想避免。

我可以倒退,比如:

var allBooks = from b in db.Books.Include("Author")
               where b.IsFiction
               select b;

但后來我回到原來的問題,除了現在在作者方而不是書方。

必須有一個包含所有內容的解決方案 - 我可以很容易地在SQL中完成它:

select * from author a
left join book b on a.id = b.author_id and b.is_fiction = 1
where a.birth_year > 1900

有什么建議?

前進方式:

var q = from a in db.Authors.Include("Books")
        where a.BirthYear > 1900
        select new {
            Author = a,
            FictionBooks = a.Books.Where(b => b.IsFiction)
        };

另一種方法,源自問題底部的SQL:

var q = from a in db.Authors
        from b in db.Books.Include("Author")
        where a.BirthYear > 1900 && b.IsFiction && a.Id == b.Author.Id
        select new { Author = a, Book = b };

這兩者之間的主要區別在於,第一個基本上會給你一組作者以及每個作者的小說書清單(可能是空的); 而第二個會給你一組作者/書籍對(因此它不會返回任何沒有小說書籍的作者)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM