2017-09-15 99 views
0

我正在嘗試按屬性的長度排序Linq查詢的結果,然後通過屬性本身來排序字符串作爲整數,但生成的SQL沒有按照我預期的那樣排序。Linq OrderBy字符串屬性長度必須在選擇列表

我加入多個表,過濾下來,以選擇一個DTO出來:

query = basequery.Select(s => new HeadersDTO 
{ 
    headerid = s.Header.id, 
    orderno = s.Header.orderno, 
    customer = s.Header.customer, 
    dateoforder = s.Header.dateoforder, 
    consignee = s.Location.name, 
    city = s.Location.name, 
    state = s.Location.state 
}).Distinct(); 

然後試圖命令由s.Header.orderno

query = query.OrderByDescending(x => x.orderno.Length).ThenByDescending(x => x.orderno) 
.Skip(() => offset).Take(() => criteria.per_page); 

這仍然令它正常的方式串排序第一個字符優先。

但是,如果我選擇x.orderno.Length進入它自己的屬性,然後通過它的順序工作,例如,

query = basequery.Select(s => new HeadersDTO 
{ 
    ordernolength = s.Header.orderno.Length <---- added this 
    headerid = s.Header.id, 
    orderno = s.Header.orderno, 
    customer = s.Header.customer, 
    dateoforder = s.Header.dateoforder, 
    consignee = s.Location.name, 
    city = s.Location.name, 
    state = s.Location.state 
}).Distinct(); 

query = query.OrderByDescending(x => x.ordernolength).ThenByDescending(x => x.orderno) 
.Skip(() => offset).Take(() => criteria.per_page); 

有沒有辦法做到這一點,我沒有創建在選擇列表中的新特性?如果需要,我可以添加更多信息。

+0

'query.OrderByDescending(X => Int32.Parse(x.orderno))' –

+0

是orderNo數字基於字符串? –

+0

@SamAxe我以前見過,但它會拋出一個'Linq To Entities不能識別Int 32 Parse'錯誤。 –

回答

0

嘗試使用IComparer創建自定義比較器,您可以在此處對該字段進行Int32檢查。下面是一個這樣的例子:

Use own IComparer<T> with Linq OrderBy

希望這有助於

+0

或者你可以使用比較器來比較長度,例如。 –

+2

'IComparer'不會幫助,因爲查詢正用於投影SQL。我不知道可以將二進制「IComparer」代碼功能投影到SQL的ORM,對嗎? – ErikE

+0

哦對:(對不起 –