2012-05-30 78 views
1

我有一個使用lambda表達式的查詢,我希望能夠從父表的子集中的列中進行排序。查詢看起來是這樣的:如何訂購通過在lambda表達式中使用子集合

var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.OrderBy(t => t.SortOrder)); 

的SortOrder的列駐留3個級別上深下時間表實體,我不知道用來訪問哪些擴展。當我使用上面的代碼時,出現錯誤「DbSortClause表達式必須具有可比較的類型 參數名稱:key」。如果我使用選擇擴展而不是第二個OrderBy,我會得到相同的錯誤。有誰知道我可以通過這個專欄排序嗎?這個「SortOrder」列不是主鍵或外鍵。

感謝

+3

按順序排列整個子實體序列是無意義的。只有將子實體集合成單個值纔可以用於排序是有意義的。這可以通過選擇一個實體(通過'First()')或使用匯總運算符(如Max和Sum)來完成。 –

+0

它看起來像你試圖在同一時間多個東西排序?時間軸和documentRules之間是否存在1對1的關係? –

回答

0

它看起來像你試圖通過多個子項,其中並沒有真正意義的編譯器進行排序。如果確實是有這兩個實體之間的1對1的關係,你可以嘗試像

var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.First().SortOrder)); 

這可能會導致一個空的異常取決於你的數據庫是如何設置的。

+0

當我使用First()方法時,我得到「The method'First'只能用作最終的查詢操作。請考慮在此實例中使用方法'FirstOrDefault'。「FirstOrDefault()不會失敗,但不會以正確的順序返回它們。TimeLine和DocumentRule之間沒有直接關係。時間軸可以有一條規則,一個規則可以有namy DocumentRules。DocumentRule表有一個SortOrder列,我想在我的OrderBy中使用。我可以在SQL中這樣做: – rvenable

+0

對不起...被切斷 select * from timeline t inner join [規則]對t.ruleid = r.ruleid內部加入文檔d在t.ruleid = d.ruleid其中 order by d.sortorder 我應該說一個時間表可以有一個規則和規則可以存在於許多DocumentRules中 DocumentRule表是一個查詢表,它只是Rule表的一個子集謝謝 – rvenable

+0

好的,如果給定的時間有3種不同的文檔規則嗯,我應該用哪一個來命令?如果我有兩種不同的時間表,每種時間表都有三種不同的文檔規則,現在我有九個單獨的可排序項目,但我只是試圖分類兩件事。所以你必須寫一些指定要排序的文檔規則。相反,您可以添加排序順序到時間線 –

1

我知道這是一個古老的線程,但我遇到這個帖子,因爲我有同樣的問題,因爲它沒有答案,我想我會分享我的解決方案,如果它幫助別人。

假設你有一個要求顯示一個實際的父母(即...媽媽/爸爸)和他們的孩子,但你想要在報告中按字母順序顯示孩子的名字。如果它們不在正確的順序中,則必須通過子表上的「名稱」字段對其進行排序,以根據要求顯示它們。如預期那樣工作

簡單的T-SQL例如:

select * from ParentTable p 
inner join ChildTable c on c.ParentId = p.ParentId 
where p.ParentId = 1 
order by c.Name 

我曾試圖做到這一點的方式,原來的海報做了(如下圖所示),並得到了「DbSortClause表達式必須有一個類型是相同的訂單可比「的例外。

.OrderBy(x => x.ParentTable.ChildTable.OrderBy(y => y.Name)) 

我使用的投影所以這可能並不適用於所有的工作,但我發現,如果我做了排序依據它的工作,因爲我想它太子列表的投影內。

Children = x.ParentTable.ChildTable.OrderBy(y => y.Name).Select(aa => new ChildTableModel 

有很可能是一個更好的/不同的方式來做到這一點,但是這確實是我想要的,所以我想我也有同感。

相關問題