在NHibernate中检查.Any中的区分大小写

时间:2016-03-09 21:31:04

标签: c# linq nhibernate

我的问题开始尝试找到与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行检查事件名称的区分大小写的最佳方法是什么?

1 个答案:

答案 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 herehere所示。

如果你想使用QueryOver,使用linq子查询(Any)并不认为我应该用QueryOver来表示子查询的方式。我不熟悉QueryOver,您应该从文档中了解如何表达您的额外限制。或者问一个关于它的新问题。