[英]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
展平連接的B
和C
的列表,然后投影到單個匿名類型
(請注意,我正在為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.