我有两个实体:Client和AccountPlan,它们之间的关系为1到0..1。我想获取我的客户端,首先由拥有AccountPlan的客户端订购,然后由不拥有AccountPlan的客户端订购。当我尝试以下Linq到Nhibernate查询时:
return NHibernateSession.Current.Query<Client>()
.Where(x => x.SalesRepId == id)
.OrderBy(x => x.AccountPlan == null);
我收到QuerySyntaxException并带有以下消息:
{“抛出了类型'Antlr.Runtime.NoViableAltException'的异常。 [.OrderBy(。凡(NHibernate.Linq.NhQueryable`1 [FIS.AccountManagement.Core.Domain.Client] 引用((x,)=&gt;(等于(x.SalesRepId,p1))),),引用((x,)=&gt; (Equal(x.AccountPlan,))),)]“}
这是两个实体之间的映射关系,如果这很重要:
public ClientMap()
{
HasOne(x => x.AccountPlan).PropertyRef(r => r.Client);
}
public AccountPlanMap()
{
DynamicInsert();
References(x => x.Client, "EntityID");
}
有没有人知道来自NHibernate的无数API之一的查询将实现我想要的?提前致谢。
答案 0 :(得分:1)
一次往返的两个查询连在一起
var clientsWithPlan = NHibernateSession.Current.Query<Client>()
.Where(x => x.SalesRepId == id)
.Where(x => x.AccountPlan != null)
.Future();
var clientsWithoutPlan = NHibernateSession.Current.Query<Client>()
.Where(x => x.SalesRepId == id)
.Where(x => x.AccountPlan == null)
.Future();
return clientsWithPlan.Concat(clientsWithoutPlan);
答案 1 :(得分:1)
使用条件运算符:
return NHibernateSession.Current.Query<Client>()
.Where(x => x.SalesRepId == id)
.OrderBy(x => x.AccountPlan == null ? 1 : 0);
答案 2 :(得分:0)
作为一种解决方法,您可以从数据库中无序检索所有客户端,然后使用LINQ to对象在应用程序中执行排序:
var clients = NHibernateSession.Current.QueryOver<Client>()
.Where(x => x.SalesRepId == id)
.Fetch(x => x.Account).Eager
.List();
return clients.OrderBy(x => x.AccountPlan == null);