有條件的包含在linq中的實體?

conditional entity-framework include linq

我覺得以下應該是可能的我只是不確定採取什麼方法。

我想要做的是使用include方法來塑造我的結果,即定義沿著對像圖遍歷的距離。但是......我希望這種遍歷是有條件的。

something like...

dealerships
    .include( d => d.parts.where(p => p.price < 100.00))
    .include( d => d.parts.suppliers.where(s => s.country == "brazil"));

我知道這不是有效的linq,事實上,它是非常錯誤的,但實質上我正在尋找一些方法來構建一個表達樹,它將返回形狀結果,相當於......

select *
from dealerships as d
outer join parts as p on d.dealerid = p.dealerid
    and p.price < 100.00
outer join suppliers as s on p.partid = s.partid
    and s.country = 'brazil'

重點是加入條件。

我覺得這對esql來說是相當直接的,但我最喜歡的是動態構建表達式樹。

一如既往,感謝任何建議或指導

一般承認的答案

這應該做的伎倆:

using (TestEntities db = new TestEntities())
{
    var query = from d in db.Dealership
                select new
                {
                    Dealer = d,
                    Parts = d.Part.Where
                    (
                        p => p.Price < 100.0 
                             && p.Supplier.Country == "Brazil"
                    ),
                    Suppliers = d.Part.Select(p => p.Supplier)
                };

    var dealers = query.ToArray().Select(o => o.Dealer);
    foreach (var dealer in dealers)
    {
        Console.WriteLine(dealer.Name);
        foreach (var part in dealer.Part)
        {
            Console.WriteLine("  " + part.PartId + ", " + part.Price);
            Console.WriteLine
                (
                "  " 
                + part.Supplier.Name 
                + ", " 
                + part.Supplier.Country
                );
        }
    }
}

此代碼將為您提供經銷商列表,每個經銷商都包含已過濾的部件列表。每個部分都引用了供應商。有趣的是,您必須以所示方式在select中創建匿名類型。否則,經銷商對象的Part屬性將為空。

此外,您必須在從查詢中選擇經銷商之前執行SQL語句。否則,經銷商的Part屬性將再次為空。這就是我將ToArray()調用放在以下行中的原因:

var dealers = query.ToArray().Select(o => o.Dealer);

但我同意Darren的觀點,這可能不是您圖書館用戶所期望的。


熱門答案

你確定這是你想要的嗎?我問的唯一原因是,一旦您在經銷商的零件上添加過濾器,您的結果就不再是經銷商。您處理的特殊對像在很大程度上非常接近經銷商(具有相同的屬性),但“部件”屬性的含義是不同的。它不是經銷商和零件之間的關係,而是過濾關係。

換句話說,如果我從你的結果中抽出經銷商並傳遞給我寫的方法,然後在我的方法中我打電話:

var count = dealership.Parts.Count();

我期待得到零件,而不是價格低於100美元的巴西過濾零件。

如果您不使用經銷商對像傳遞過濾後的數據,則變得非常容易。它變得如此簡單:

    var query = from d in dealerships
               select new { DealershipName = d.Name, 
CheapBrazilProducts = dealership.Parts.Where(d => d.parts.Any(p => p.price < 100.00) || d.parts.suppliers.Any(s => s.country == "brazil")) };

如果我只是像你要求的那樣得到過濾後的集合,我可能會使用上面提到的技術,然後使用像Automapper這樣的工具將過濾後的結果從我的匿名類複製到真正的類。它不是非常優雅,但它應該工作。

我希望有所幫助!這是一個有趣的問題。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因