7

我建立一个ASP.Net MVC 3应用程序与实体框架4.当两段代码如下执行,这两个变量(QUERY1和QUERY2)有LINQ动态查询库

System.Data.Objects.ObjectQuery<Asset.Model.Equipment> 
返回类型

Query1使用ObjectContext的直接实例,但是,Query2使用一个存储库模式,即它在EquipmentService中调用GetEquipment,它依次调用Equipment Repository中相同的命名方法。无论是在服务和库回归方法

IQueryable<Equipment> 

如何,这里是我的问题,怎么来QUERY2只会在工作的时候包括

using System.Linq.Dynamic; 

在我的控制器顶部

using (AssetEntities context = new AssetEntities()) 
     { 
      var query1 = context.Equipments 
      .OrderBy("it." + sidx + " " + sord) 
      .Skip(pageIndex * pageSize) 
      .Take(pageSize); 
     } 


     var query2 = equipService.GetEquipment() 
      .OrderBy(sidx + " " + sord) 
      .Skip(pageIndex * pageSize) 
      .Take(pageSize); 

如果我从我的控制器omitt System.Linq.Dynamic,我得到内QUERY2错误在

.OrderBy(sidx + " " + sord) 

其中规定

The type arguments for method 'System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly 

有谁知道为什么QUERY1可以不必使用System.Linq.Dynamic工作,但需要QUERY2它来执行?

谢谢大家。

回答

6

在第一个查询context.Equipments具有类型ObjectQuery<Equipment>ObjectQuery<T>有方法OrderBy(string)哪一个需要.OrderBy("it." + sidx + " " + sord)。所以第一个查询工作。

在第二个查询使用类型IQueryable<Equipment>equipService.GetEquipment()。该IQueryable<T>只有扩展方法OrderByExpression<Func<T, TKey>>作为参数,而不是string。因此,要使用OrderBy你必须写类似

equipService.GetEquipment().OrderBy(e => e.equipmentID) 

IQueryable<Equipment>但它不是你可以使用的东西。您需要另一种扩展方法,它可以为您提供表单System.Linq.Dynamic的LINQ动态查询库。

在许多情况下LINQ到实体具有many restrictions,但在你的情况下,它具有更多的优点的LINQ to SQL。所以我建议你留在你的案例中的LINQ to Entities。我相信,通过直接在您使用的实体框架中直接支持所有功能,您将获得更好的性能。

因为LINQ to Entities或ObjectQuery<Equipment>支持Where(string)方法(确切地说是ObjectQuery.Where(string predicate, params ObjectParameter[] parameters)方法),您可以比较容易地在jqGrid中实现过滤/搜索。的.Where使用可以(在ObjectParameter的 “maxId” 的使用而不是 “@maxId” 的不打字错误)是

.Where("it.equipmentID < 100") 

.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100)) 

例如。

修订:在the answer“更新”的一部分,你可以找到the example它展示了如何实现过滤/基于我上述的想法jqGrid的搜索。

+0

这是一个很好的答案。感谢您的时间:) – tgriffiths 2011-03-02 10:18:11

+0

@tgriffiths:在[答案](http://stackoverflow.com/questions/5500805/asp-net-mvc-2-0-implementation-of-searching-in-jqgrid/5501644# 5501644)我演示了如何在jqGrid中实现过滤/搜索,它可以用于[工具栏搜索](http://www.trirand.com/jqgridwiki/doku.php?id=wiki:toolbar_searching)和[高级搜索] (http://www.trirand.com/jqgridwiki/doku.php?id=wiki:advanced_searching)。我用相应的链接更新了我的答案。 – Oleg 2011-04-03 20:14:53

4

“它”是默认ObjectQuery.Name属性值。实际上,当您使用第一个查询时,将执行隐式的Entity SQL Order By子句,而第二个查询则使用LINQ to Entities,并且它需要System.Linq.Dynamic名称空间才能正常工作。