LINQ:QuerySyntaxException
我已经编写了一些复杂的LINQ查询,我正试图对NHibernate运行这些查询,不幸的是,在尝试计算查询时,这会导致异常(call.ToList()) 下面是代码,该代码用于检索带有一些额外数据的问题对象:LINQ:QuerySyntaxException,linq,nhibernate,linq-to-nhibernate,Linq,Nhibernate,Linq To Nhibernate,我已经编写了一些复杂的LINQ查询,我正试图对NHibernate运行这些查询,不幸的是,在尝试计算查询时,这会导致异常(call.ToList()) 下面是代码,该代码用于检索带有一些额外数据的问题对象: var list = from i in sess.Query<Issue>() let readFlag = (from f in i.ReadFlags where (f.User != null &&
var list = from i in sess.Query<Issue>()
let readFlag = (from f in i.ReadFlags
where (f.User != null && f.User.Username == request.UserName)
||
(f.Device.Name == request.MachineName)
select f).FirstOrDefault()
let isUnread = readFlag == null
let unreadCommentsCount = isUnread ? 0 : (from c in i.Comments
where c.DateCreated > readFlag.LastSeenCommentDate
select c).Count()
let statusChanged = isUnread && i.Status != readFlag.LastSeenStatus
where isUnread || unreadCommentsCount > 0 || statusChanged
select new
{
Issue = i,
ReadFlag = readFlag,
IsUnread = isUnread,
UnreadCommentsCount = unreadCommentsCount
};
var list=来自sess.Query()中的i
让readFlag=(从i.ReadFlags中的f开始)
其中(f.User!=null&&f.User.Username==request.Username)
||
(f.Device.Name==request.MachineName)
选择f).FirstOrDefault()
让isUnread=readFlag==null
let unreadCommentsCount=是否未读?0:(来自i.评论中的c)
其中c.DateCreated>readFlag.LastSeenCommentDate
选择c.Count()
让状态更改=未读(&i)状态!=readFlag.LastSeenStatus
其中未读| |未读注释>0 | |状态已更改
选择新的
{
问题=我,
ReadFlag=ReadFlag,
IsUnread=IsUnread,
unreadcommentscont=unreadcommentscont
};
i、 e.-对于每个问题对象,查找与当前用户名或计算机名匹配的相关IssueReadFlag。如果该标志存在,它还包含“最后一次看到的注释日期”,因此代码将计算此问题的新注释数
不幸的是,NHibernate无法处理此查询()
我正在寻找这个问题的最佳解决方案。
获取所有问题对象并在客户端应用查询条件对我来说是不可接受的
试图找出问题的原因:当我在“select”和“where”语句中注释掉对unreadCommentsCount和statusChanged的评估时,它开始工作。根据这一线索,似乎在这些子查询中引用readFlag会导致问题(在“let UnreadCommentScont..”和“let statusChanged..”条件中删除对readFlag的引用后,查询不会引发异常)。
现在我需要一个关于如何使它再次正常工作的提示…进一步调查这个问题,我发现NHibernate无法处理readFlag存在的不确定状态 最后,我将查询分为两部分,第一部分处理readFlag不存在的所有问题,第二部分直接查询IssueReadFlag,计算未读注释计数和更改状态
这似乎是目前唯一的解决方案。您是否考虑过从一个常规的
查询开始,并添加这些不同的检查项来缩小问题的范围?@Ocelot20同时尝试了这一点。请参阅问题的更新