我遇到过需要在LINQ to Entities查询中使用自定义表达式的情况(因为我想拥有L2E无法理解的自定义逻辑:
var query = db.MyTable.Where(MyPredicateExpression)
但我宁愿使用查询理解语法:
var query = from x in db.MyTable where [x matches the predicate of MyPredicateExpression]
我知道这是可能的,因为L2E在其他地方支持它:
var query = from x in db.MyTable where x.Length > 10
他们如何做到这一点?
编辑:我正在使用devart的LinqConnect for Oracle,其行为可能与Microsoft L2E略有不同。
答案 0 :(得分:1)
实体框架和LINQ to SQL不支持这种情况,因为应将MyPredicateExpression的转换添加到表达式树转换器中。
我建议您创建执行谓词检查的存储函数,并将此函数添加到DataContext。在这种情况下,您将能够使用如下所示的查询:
var query = from x in db.MyTable where context.MyPredicateFunction(x.Field) select x;
更新。以下是考虑到您的评论的更新后的查询:
int[] values = new int[] { 1, 2, 3 };
var query = from x in db.MyTable where values.Contains(x.AuditState) select x;
更新2。您可以向您的上下文添加一个Queryable属性,该属性将获取必要的MyTable对象集,如以下示例所示:
public partial class MyDataContext {
IQueryable<MyTable> GetSpecialTables {
get {
int[] values = new int[] { 1, 2, 3 };
return this.MyTables.Where(x => values.Contains(x.AuditState));
}
}
}
将MyDataContext替换为您的上下文的实际名称。
答案 1 :(得分:0)
如果我正确理解了问题,你可以使用扩展方法或调用返回bool的函数。