如何在DevArt LINQ to实体中使用自定义表达式,以及如何使用查询理解语法?

如何在DevArt LINQ to实体中使用自定义表达式,以及如何使用查询理解语法?,linq,linq-to-sql,linq-to-entities,devart,Linq,Linq To Sql,Linq To Entities,Devart,我遇到了一种情况,需要在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 q

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

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

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

实体框架和LINQ到SQL不支持此方案,因为MyPredicateExpression的转换应添加到表达式树转换器。
我建议您创建一个执行谓词检查的存储函数,并将此函数添加到DataContext。在这种情况下,您将能够使用如下查询:

var query=从db.MyTable where context.mypredicateffunction(x.Field)中的x选择x;

更新。以下是考虑到您的评论的更新查询:

int[] values = new int[] { 1, 2, 3 };
var query = from x in db.MyTable where values.Contains(x.AuditState) select x;  
更新2。您可以将可查询属性添加到上下文中,以获取必要的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{
IQueryable GetSpecialTables{
获取{
int[]值=新的int[]{1,2,3};
返回此.MyTables.Where(x=>values.Contains(x.AuditState));
}  
}
}

用上下文的实际名称替换MyDataContext。

实体框架和LINQ到SQL不支持此方案,因为MyPredicateExpression的翻译应添加到表达式树转换器。
我建议您创建一个执行谓词检查的存储函数,并将此函数添加到DataContext。在这种情况下,您将能够使用如下查询:

var query=从db.MyTable where context.mypredicateffunction(x.Field)中的x选择x;

更新。以下是考虑到您的评论的更新查询:

int[] values = new int[] { 1, 2, 3 };
var query = from x in db.MyTable where values.Contains(x.AuditState) select x;  
更新2。您可以将可查询属性添加到上下文中,以获取必要的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{
IQueryable GetSpecialTables{
获取{
int[]值=新的int[]{1,2,3};
返回此.MyTables.Where(x=>values.Contains(x.AuditState));
}  
}
}

将MyDataContext替换为您上下文的实际名称。

这将适用于Linq to对象,其中方法在客户端计算,但不适用于Linq to实体,其中方法必须转换为SQL才能在服务器上执行。这将适用于Linq to对象,其中方法在客户端计算,但不适用于Linq to Entities,其中该方法必须转换为SQL才能在服务器上执行。我可以添加一个不是数据库函数的存储函数吗?我尝试这样做:我有一个名为AuditState的字段,它跟踪对象的状态,我经常需要执行where子句,如:where AuditState=1或AuditState=2或AuditState=3。在整个过程中重复这一点很烦人,所以我想把它放在一个函数中。但我不想让它成为Oracle中的一个函数,只想在查询中注入一些逻辑,如:WHERE IsSpecial(AuditState)。我怎样才能将这样的内容添加到数据上下文中?@Joshua,你错过了where子句。@Devart:我知道,我在编辑之前不小心提交了编辑。谢谢你的帮助。@Devart:这里的问题是,我需要将值数组复制到我想使用例程的任何地方,这就违背了这一点。我需要的是一种将我的逻辑告诉表达式解析器的方法,这样我就可以编写x.AuditState.IsSpecial(或者,更理想的情况是,编写context.IsSpecial(x.AuditState)),在表达式转换过程中,它会将其转换为“x.AuditState=1或x.AuditState=2或x.AuditState=3”。如果我们能够钩住翻译以指定数据库函数或存储过程,那么也应该可以指定自定义SQL代码。@Devart:非常感谢您的帮助。完全解决了我的问题,尽管我找到了一种更方便的方法来排列代码,我在您的原始答案中已对其进行了更新。我可以在at不是一个数据库函数?我想做的是:我有一个名为AuditState的字段,它跟踪一个对象的状态,我经常需要执行where子句,比如:where AuditState=1或AuditState=2或AuditState=3。在整个过程中重复这一点很烦人,所以我想把它放在函数中。但我不想把它变成fu在Oracle中,只是一些注入到查询中的逻辑,如:WHERE IsSpecial(AuditState)。我怎样才能将这样的内容添加到数据上下文中?@Joshua,你错过了where子句。@Devart:我知道,我在编辑之前不小心提交了编辑。谢谢你的帮助。@Devart:这里的问题是,我需要将值数组复制到我想使用例程的任何地方,这就违背了这一点。我需要的是一种将我的逻辑告诉表达式解析器的方法,这样我就可以编写x.AuditState.IsSpecial(或者,更理想的情况是,编写context.IsSpecial(x.AuditState)),在表达式转换过程中,它会将其转换为“x.AuditState=1或x.AuditState=2或x.AuditState=3”。如果我们能够钩住翻译以指定数据库函数或存储过程,那么也应该可以指定自定义SQL代码。@Devart:非常感谢您的帮助。完全解决了我的问题,尽管我找到了一种更方便的方法来排列代码,我在您的或中更新了该方法