vIc*_*erg 1 linq nhibernate linq-to-nhibernate
注意:所有代码都写在我的脑海中.它可能包含一些错误.只是得到这个问题的总体意义)
采用这个类定义:(简化为了简化)
public class CodedValue
{
public string Code { get; set; }
public string Value {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
拍摄对象:
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);
Run Code Online (Sandbox Code Playgroud)
cvList包含要过滤的CodedValue列表.
让我假装我的数据库包含记录:
CODE VALUE
A 1
A 2
B 1
B 2
Run Code Online (Sandbox Code Playgroud)
现在,我想检索编码值在列表中的所有对象
var filter = from o in MyRepository.List()
where cvList.Contains(o.CodedValue)
select o;
Run Code Online (Sandbox Code Playgroud)
NHibernate将此Linq翻译为:
select [Fields...] from [Table...]
where Code in ('A', 'B') and Value in ('1', '2');
Run Code Online (Sandbox Code Playgroud)
这是错的.如果你看一下我的记录示例,这个SQL将返回所有行.SQL应该转换为:
select [Fields...] from [Table...]
where (Code = 'A' and Value = '1') or (Code = 'B' and Value = '2');
Run Code Online (Sandbox Code Playgroud)
那么,我可以使用Linq得到我想要的结果吗?如果是这样,怎么样?如果没有,我怎么能实现呢?
谢谢
好的,这是解决方案!
我在这个网站上使用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);
Run Code Online (Sandbox Code Playgroud)
该生产线CodedValue cv = codedValue的foreach声明非常重要.省略该行将构造正确的SQL语法,但参数的值对于所有人都是相同的.
我真的希望它会帮助别人.