0

我有以下实体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 实体),此示例将输出以下 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')

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

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

4

4 回答 4

0

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


您可以在http://entityrestsdk.codeplex.com查看 Entity 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 属性比较,如下所示。

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

 { '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 的查询语法创建可组合查询具有很大的优势。

于 2013-07-31T08:42:17.633 回答
0

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

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

是一个例子

于 2013-07-31T09:01:53.597 回答
0

LINQ 中有两种基本的动态表达式和查询方法。3 如果您计算使用 Json 作为获取 lambda 表达式的方法。=> Akash Kava 帖子

a) 字符串动态 Lambda

System.Linq.Dynamic 可以在以下链接中找到 http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx http://weblogs.asp.net/scottgu/archive/2008/01/07/动态 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

于 2013-07-31T13:24:04.373 回答
0

我建议采用与上述答案稍有不同的方式并使用 EntitySQL,因为在动态条件下构建类似 SQL 的字符串是微不足道的。

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

于 2013-07-31T13:29:31.713 回答