1

我有一种情况,我需要在 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 有所不同。

4

2 回答 2

1

Entity Framework 和 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 替换为您的上下文的实际名称。

于 2011-06-02T14:12:43.347 回答
0

如果我正确理解了问题,您可以使用扩展方法或调用返回布尔值的函数。

于 2011-06-01T16:35:12.350 回答