簡體   English   中英

通用存儲庫:如何在相同的類上加入列表屬性

[英]Generic Repository: How to Join List Properties on Same Class

我有一個帶有兩個列表屬性的類,需要由該類的使用者加入。 該類是通過通用存儲庫檢索的。 方法如下:

IList<TEntity> GetAll(params Expression<Func<TEntity, object>>[] navigationProperties);

具有子類/列表屬性的類:

public class A
{
    // I need to join these 2 in the caller
    public IList<B> BList { get; set; } // Bs have an ID property
    public IList<C> CList { get; set; } // Cs have an ID property
}

使用(這是我嘗試過的):

var x = Repository.GetAll(i=>i.BList)
        .Join(Repository.GetAll(i=>i.CList), outerkey => outerkey.???, ...

Intellisense僅顯示A類的屬性,而不顯示B或C的屬性。為什么它不顯示B和C的ID屬性? 我要解決這個錯誤嗎? 這不是一個智能問題。

當前設置中的GetAll返回A的列表,我假設填充了關聯的B 然后,您嘗試將與填充了C另一個 A列表連接。

你想的是一個列表A s的兩個 b S和c人口s,然后做一些投影加盟后B S和C秒。

我將SelectMany ,首先使用SelectMany展平連接的BC的列表,然后投影到單個匿名類型

(請注意,我正在為Join部分使用查詢語法,因為在這種情況下,它比方法語法干凈得多)

//`A`s with `B`s and `C`s populated
var as = Repository.GetAll(i=>i.BList, i=>i.CList);

var query = as.SelectMany(a => (from b in a.BList
                                join c in a.CList
                                   on b.Id equals c.Id
                                select new {b, c}),   // get the matching Bs and Cs
                         (a, bc) => a./*A Property here*/,
                                    bc.b./*B property here*/,                                                    
                                    bc.c./*C property here*/)
                         )

Intellisense有時難以跟上代碼編輯器的作用-在帶有LINQ的Visual Studio 2013中,我經常看到這一點。 您可以做的一件事是避免類型推斷,並在join方法中指定泛型類型參數。 這不是確切的,但是像這樣:

...Join<B, C, int, B>(outer => outer.ID, inner => inner.ID, <etc etc>

前兩個類型參數分別是外部列表和內部列表的類型(在您的情況下為B和C)。 第三個是密鑰的類型(即ID)。 最后一個是結果的類型。 如果您想為此使用匿名類型,那么可悲的是您必須使用類型推斷。

暫無
暫無

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

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