Linq to NHibernate OrderBy Enum value
本文关键字:Enum value OrderBy NHibernate to Linq | 更新日期: 2023-09-27 18:35:42
我有以下枚举,它描述了一个项目的状态和一个代表该项目的对象。
public Enum Status
{
Sent,
Received,
UnderWork,
Returned
}
public Class Item
{
public virtual int Id {get;set;}
public virtual Status CurrentStatus {get;set;}
public virtual string ItemDescription {get;set;}
public virtual int ItemNumber {get;set;}
public virtual DateTime DueDate {get;set;}
}
我需要创建一个查询,在其中我可以选择多个项目,并首先按 CurrentStatus 属性对它们进行排序,然后按 DueDate 属性对它们进行排序。困难在于我想按当前状态排序,方法是将所有具有返回状态的项目放在最后,同时按到期日期排序,然后仅按截止日期订购所有其他项目并忽略当前状态。
所以下面的数据列表:
ID | CurrentStatus | ItemDescription | ItemNumber | DueDate
-------------------------------------------------------------
1 | Returned | Description1 | 123456 | 16/01/2012
2 | Sent | Description2 | 234567 | 13/01/2012
3 | Returned | Description3 | 345678 | 22/01/2012
4 | Received | Description4 | 456789 | 03/01/2012
5 | UnderWork | Description5 | 567891 | 10/01/2012
6 | UnderWork | Description6 | 678901 | 17/01/2012
7 | Sent | Description7 | 789012 | 09/01/2012
8 | Sent | Description8 | 890123 | 28/01/2012
9 | Returned | Description9 | 901234 | 30/01/2012
10 | Received | Description10 | 012345 | 15/01/2012
将使用类似于以下Linq到NHibernate的东西进行查询(这给了我一个QuerySyntaxException:抛出了类型为"Antlr.Runtime.NoViableAltException"的异常。请注意,在 LINQPad 中使用此表达式,我可以得到所需的结果。
var workList = session.Query<Item>()
.OrderBy(item => item.Status == Status.Returned)
.ThenBy(item => item.DueDate)
.ToList();
我希望按以下顺序获得数据列表:
ID | CurrentStatus | ItemDescription | ItemNumber | DueDate
-------------------------------------------------------------
4 | Received | Description4 | 456789 | 03/01/2012
7 | Sent | Description7 | 789012 | 09/01/2012
5 | UnderWork | Description5 | 567891 | 10/01/2012
2 | Sent | Description2 | 234567 | 13/01/2012
10 | Received | Description10 | 012345 | 15/01/2012
6 | UnderWork | Description6 | 678901 | 17/01/2012
8 | Sent | Description8 | 890123 | 28/01/2012
1 | Returned | Description1 | 123456 | 16/01/2012
3 | Returned | Description3 | 345678 | 22/01/2012
9 | Returned | Description9 | 901234 | 30/01/2012
这可以使用Linq到NHibernate来完成吗?如果是这样,我需要对查询进行哪些更改?此外,我将期待SKip()和Take(),所以我不能只是从数据库中提取所有内容。我使用的是SQL Server 2008 Express,NHibernate 3.3.0.4000和Fluent Nhibernate 1.3.0.727。
编辑
只是为了详细说明我希望如何进行排序。我希望将具有返回状态的项目推送到列表底部,按截止日期对其进行排序。我希望所有其他项目不按状态排序,而只按截止日期排序,因此它们将始终排在返回的项目之前。这是因为返回的任何内容都不再在工作过程中,我希望将其推送到列表的末尾。因此,在这种情况下,返回以外的状态值无关紧要。
我有用。NHibernate应该如何处理状态并生成SQL case
语句更加明确。
var workList = session.Query<Item>()
.OrderBy(item => item.CurrentStatus == Status.Returned ? 1 : 0)
.ThenBy(item => item.DueDate)
.ToList();
您的 LINQ 查询似乎存在问题。不确定您是否有意使用它,但您不应该用.OrderBy(item => item.Status)
而不是.OrderBy(item => item.Status == Status.Returned)
吗?这可能会混淆NHibernate的表达式解析器。
你是如何将枚举映射到数据库的?到int
列(默认)?还是字符串?
你能解释一下预期的清单吗?考虑到您按状态排序,您不应该先Sent
项目,然后是Received
,然后是UnderWork
,最后是Returned
吗?预期列表看起来排序不正确。