我的问题开始尝试找到与NHibernate一起使用的区分大小写的比较。
public List<MessageLog> GetLogsByFileAndEventName (string fileName, string eventName, DateTime? after,
DateTime? before)
{
var query = m_session.QueryOver<Log> ()
.Where (x => x.CreatedOn >= after && x.CreatedOn <= before);
if (fileName != null)
(2) query = query.Where (x => x.FileName.Equals (fileName));
if (eventName != null)
(3) query = query.Where (x => x.LogRecords.Any (y => y.Event.Name.Equals (eventName)));
return query.List<Log>().ToList();
}
我现在用
替换了第2行query = query.Where (Expression.Sql (" FileName = ? COLLATE Latin1_General_CS_AS", fileName, NHibernateUtil.String));
产生区分大小写的比较。我在比较事件名称时尝试使用类似的行为(第3行),但这会导致与参数不匹配。
编辑:我已经尝试了
query = query.Where (x => x.Records.Any(Expression.Sql (" SomeEvent.Name = ? COLLATE Latin1_General_CS_AS", eventName, NHibernateUtil.String)));
这导致"Argument type 'Nhibernate.Criterion.AbstractCriterion' is not assignable to parameter type 'System.Func<projectname.Dir.Nhibernate.Logs.LogRecord, bool>'
我已经尝试了几种其他方式与linq(我相当新的)在案例比较之前不会产生我想要的结果。
我的问题:
在第3行检查事件名称的区分大小写的最佳方法是什么?
答案 0 :(得分:1)
您使用的是QueryOver API,它不是linq API。它可以使用lambda表达式作为linq,但它不是linq。
我相信你有异常,但你有一个编译错误。您无法将NHibernate标准(Expression.Sql
生成标准)与linq方法结合使用(Any
是linq方法,而在代码中query.Where
是QueryOver方法)。
如果你想使用linq,你应该使用linq-to-nhibernate。
using NHibernate.Linq;
...
var query = m_session.Query<Log>();
据我所知,linq-to-nibernate不支持指定排序规则。但您可以对其进行扩展,如another need here或here所示。
如果你想使用QueryOver,使用linq子查询(Any)并不认为我应该用QueryOver来表示子查询的方式。我不熟悉QueryOver,您应该从文档中了解如何表达您的额外限制。或者问一个关于它的新问题。