Sql 执行搜索的实体框架动态Lambda

Sql 执行搜索的实体框架动态Lambda,sql,linq,entity-framework,lambda,Sql,Linq,Entity Framework,Lambda,我在实体框架5(C#)中有以下实体: 在订单搜索屏幕上,用户可以输入以下搜索值: ProductName, OrderNo, CustomerName 例如,他们可能会输入: Product Search Field: 'Car van bike' Order Search Field: '100 101 102' Customer Search Field: 'Joe Jack James' 这应该对每个输入的单词进行OR搜索(理想情况下使用linq to实体),本例将输出以下wher

我在
实体框架5(C#)
中有以下实体:

在订单搜索屏幕上,用户可以输入以下搜索值:

ProductName, OrderNo, CustomerName
例如,他们可能会输入:

Product Search Field: 'Car van bike'

Order Search Field: '100 101 102'

Customer Search Field: 'Joe Jack James'
这应该对每个输入的单词进行OR搜索(理想情况下使用linq to实体),本例将输出以下where sql

(ProductName like 'Car' Or ProductName like 'van' Or ProductName like 'bike') AND

(OrderNo like '100' Or OrderNo like '101' Or OrderNo like '102') AND

(CustomerName like 'Joe' Or CustomerName like 'Jack' Or CustomerName like 'James')
我想使用LINQtoEntities实现这一点,我猜这需要某种动态lambda生成器,因为我们不知道用户可能会在每个字段中输入多少单词


我该怎么做呢?我浏览了一下,但看不到任何简单的东西。

免责声明:我是Entity REST SDK的作者


您可以在以下位置查看实体RESTSDK:

您可以使用JSON语法进行查询,如下所示

 /app/entity/account/query?query={AccountID:2}&orderBy=AccountName
     &fields={AccountID:'',AcccountName:''}
您可以使用提供的某些扩展将JSON转换为lambda

下面是如何将JSON转换为Linq的详细信息

OData v3的当前限制

此外,这个基于JSON的查询与OData不同,OData还不支持使用导航属性进行正确的搜索。OData允许您在选定实体内搜索导航属性,例如
Customer(1)/Addresses?filter=..

但在这里,我们支持任意和父属性比较,如下所示

例如,如果要搜索已购买特定商品的客户列表,则将执行以下查询

 { 'Orders:Any': { 'Product.ProductID:==': 2 } }
这被翻译成

  Customers.Where( x=> x.Orders.Any( y=> y.Product.ProductID == 2))
目前还没有办法做到这一点

JSON的优势

当您使用任何JavaScript框架时,基于英语语法创建查询并不困难,编写查询也很困难。但下面的方法可以帮助您轻松地组合查询,如图所示

function query(name,phone,email){
   var q = {};
   if(name){
       q["Name:StartsWith"] = name;
   }
   if(phone){
       q["Phone:=="] = phone;
   }
   if(email){
       q["Email:=="] = email;
   }
   return JSON.stringify(q);
}

如果指定,上述方法将组合查询和“and”所有内容。使用基于JSON的查询语法创建可组合查询具有很大的优势。

您可以使用构建lambda表达式。您需要做的是拆分值并构建表达式。然后你可以像这样转换成一个lambda表达式

var lambda = Expression.Lambda<Func<object>>(expression);  
var lambda=Expression.lambda(Expression);

例如,LINQ中有两种基本的动态表达式和查询方法。 3如果您使用Json作为获得lambda表达式的方法,则为阿卡什卡瓦邮政

a)字符串动态Lambda

System.Linq.Dynamic可在以下链接中找到

b)构建表达式树

更强大但更难掌握。。。 使用以下代码生成表达式树:

  • 另一种方法是谓词生成器,但它实际上并不是动态的。 但可以处理您作为示例给出的类型或场景。

我建议使用与上述答案稍有不同的方法,使用EntitySQL,因为使用动态条件构建类似SQL的字符串非常简单


看看PredicateBuilder:OData端点不支持过滤导航属性和自定义返回字段。您可以以简单的lambda表达式的形式强制执行安全规则。谁告诉您的?OData支持这两种功能。即使OData v3不支持“Any”子句,您也可以搜索和检索id为的实体,并搜索其导航属性,但我的做法是另一种,我们返回导航属性符合某些条件的实体列表。我想搜索代理名称以某个名称开头的所有客户,Customer.broker.name.StartsWith,如何在OData中执行此操作?Ref:是的,您不能在OData中指定1对多导航属性的条件,但可以使用资源路径语法指定1对1。另外,startswith只是有不同的语法
startswith(字段,'value')
var lambda = Expression.Lambda<Func<object>>(expression);