Linq OrderBy字符串属性长度必须在选择列表中

时间:2017-09-15 22:49:43

标签: c# entity-framework linq

我试图按属性的长度来排序Linq查询的结果,然后按属性本身来排序,以便将字符串作为整数排序,但生成的SQL不是按照我的预期排序。

我正在加入多个表格,对其进行过滤,选择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);

有没有办法在我不必在选择列表中创建新属性的情况下执行此操作?如果需要,我可以添加更多信息。

1 个答案:

答案 0 :(得分:0)

尝试使用IComparer创建自定义Comparer,您可以在此Int32检查此字段。这是一个例子:

Use own IComparer<T> with Linq OrderBy

希望这有帮助