2017-09-15 100 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

哦对:(对不起 –