带有OR语句的Linq.NHibernate问题

时间:2009-12-01 16:19:45

标签: linq nhibernate linq-to-nhibernate

注意:所有代码都写在我的头顶。它可能包含一些错误。只是得到这个问题的总体意义)

采用这个类定义: (为简单而减少)

public class CodedValue
{
  public string Code { get; set; }
  public string Value {get; set; }
}

抓住对象:

CodedValue cv1 = new CodedValue(){ Code = "A",  Value = "1" };
CodedValue cv2 = new CodedValue(){ Code = "B",  Value = "2" };
IList<CodedValue> cvList = new List<CodedValue>();
cvList.Add(cv1);
cvList.Add(cv2);

cvList包含要过滤的CodedValue列表。

让我假装我的数据库包含记录:

CODE     VALUE
A        1
A        2
B        1
B        2

现在,我想要检索编码值在列表中的所有对象

var filter = from o in MyRepository.List()
             where cvList.Contains(o.CodedValue)
             select o;

NHibernate将此Linq翻译为:

select [Fields...] from [Table...]
where Code in ('A', 'B') and Value in ('1', '2');

这是错误的。如果你看一下我的记录示例,这个SQL将返回所有行。 SQL应该转换为:

select [Fields...] from [Table...]
where (Code = 'A' and Value = '1') or (Code = 'B' and Value = '2');

那么,我可以使用Linq得到我想要的结果吗?如果是这样,怎么样?如果没有,我怎么能实现呢?

由于

1 个答案:

答案 0 :(得分:5)

好的,这是解决方案!

我在这个网站上使用PredicateBuilder:PredicateBuilder

然后,我构建了谓词:

var expr = PredicateBuilder.False<Audit>();

foreach(CodedValue codedValue in auditEventIds)
{
  CodedValue cv = codedValue;
  expr = expr.Or(a => (a.EventId.Code == cv.Code) && (a.EventId.CodeSystemName == cv.CodeSystemName));
}

itemQuery = itemQuery.Where(expr);

CodedValue cv = codedValue声明中的foreach行非常重要。省略该行将构造正确的SQL语法,但所有参数的值都是相同的。

我真的希望它会帮助别人。