实体框架动态Lambda执行搜索

时间:2013-07-31 08:35:46

标签: sql linq entity-framework lambda

我在Entity Framwork 5 (C#)中有以下实体:

OrderLine - Id, OrderId, ProductName, Price, Deleted

Order - Id, CustomerId, OrderNo, Date

Customer - Id, CustomerName

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

ProductName, OrderNo, CustomerName

例如,他们可能会输入:

Product Search Field: 'Car van bike'

Order Search Field: '100 101 102'

Customer Search Field: 'Joe Jack James'

这应该对每个输入的单词进行OR搜索(理想情况下使用linq to entities),这个例子会在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')

我想使用linq来实现这一点,我猜这需要成为某种动态lambda构建器,因为我们不知道用户可以在每个字段中输入多少单词。

我将如何做到这一点,我有一个快速浏览,但看不到任何简单。

4 个答案:

答案 0 :(得分:0)

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


您可以在http://entityrestsdk.codeplex.com

查看实体REST SDK

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

 /app/entity/account/query?query={AccountID:2}&orderBy=AccountName
     &fields={AccountID:'',AcccountName:''}

您可以使用提供的某些扩展将JSON转换为lambda。

以下是JSON如何转换为Linq的详细信息。 http://entityrestsdk.codeplex.com/wikipage?title=JSON%20Query%20Language&referringTitle=Home

OData v3的当前限制

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

但是,我们同时支持Any和Parent Property Comparison,如下所示。

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

 { 'Orders:Any': { 'Product.ProductID:==': 2 } }

这会转换为

  Customers.Where( x=> x.Orders.Any( y=> y.Product.ProductID == 2))

目前无法做到这个OData。

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的查询语法创建可组合查询是一个很大的优势。

答案 1 :(得分:0)

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

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

Here就是一个例子

答案 2 :(得分:0)

LINQ中有两种基本的动态表达式和查询方法。   3如果算上使用Json作为获取lambda表达式的方法。 =&GT;阿卡什卡瓦的帖子

a)String Dynamic Lambda

可以在以下链接中找到System.Linq.Dynamic http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx http://www.scottgu.com/blogposts/dynquery/dynamiclinqcsharp.zip

b)构建表达式树

更强大但更难掌握...... 使用此处的代码构建表达式树: http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx

答案 3 :(得分:0)

我建议与上面的答案略有不同,并使用Entity SQL,因为在动态条件下构建类似SQL的字符串是微不足道的。

http://msdn.microsoft.com/en-us/library/bb738683.aspx