2017-06-08 106 views
0

我有一個父查詢與子查詢返回子, 我需要根據父項中的一個屬性排序子查詢。 這裏是須藤代碼:LINQ嵌套查詢條件順序由

from menu in db.Menus 
        orderby menu.Order 
        select new 
        { 
         Title= menu.Title, 
         OrderNumber = menu.Order, 
         data = (from menuItem in menu.Items 
            let g = Guid.NewGuid() 
            orderby g 
           select new 
           { 
            id = worker.ID, 
            Title = worker.JobTitle 
            }) 
           .Take(4) 

        }; 

該工程確定,但我需要梳理隨機(NewGuid)一些菜單和其他人與他們的項目優先有些事喜歡它排序:

let g = Guid.NewGuid() 
orderby menu.ISRandom ? g: menuItem.Order 

但它給出了錯誤的guid和int錯誤。什麼是soloution? 第二:如何更換take(4) with take(menu.size)? 感謝的

+0

什麼是'orderbymenu'? –

+0

對不起,這是語法錯誤。更正是order by menu.IsRandom? g:menuItem.Order @GertArnold – SeifolahG

回答

1

您可以通過添加ToString()解決排序問題中:

let g = Guid.NewGuid().ToString() 
orderbymenu.ISRandom ? g : menuItem.Order.ToString() 

使用Take(someProperty)未在EF LINQ查詢允許的。這是因爲take被轉換爲TOP(x)子句,該子句不可能引用SQL結果中的列。您只能在將結果拉入內存後才能做到這一點,而不需要Take(或者採取一些合理的固定最大值)。

+0

如果'menuItem.Order'爲'int','ToString'不會導致錯誤的順序? –

+0

是的,好點。我最好將它改爲一個有條件構建的'OrderBy'調用。取決於'orderbymenu'是如何完成的。 –

+1

如果這是一個根查詢,則有條件排序可能是一個選項。對於嵌套它更復雜 - 需要LinqKit或類似的。我會建議相互排斥'OrderBy' /'ThenBy' - 像'orderby orderbymenu.ISRandom? Guid.NewGuid():Guid.Empty,orderbymenu.ISRandom? 0:menuItem.Order' :) –

0

看來你想從menu.Items隨機讀取四條記錄。

我想你會更好地閱讀所有的項目,然後在隨後的內存代碼中進行隨機選擇。