注意:所有代码都写在我的头顶。它可能包含一些错误。只是得到这个问题的总体意义)
采用这个类定义: (为简单而减少)
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得到我想要的结果吗?如果是这样,怎么样?如果没有,我怎么能实现呢?
由于
答案 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语法,但所有参数的值都是相同的。
我真的希望它会帮助别人。