tco*_*ode 7 linq-to-entities jqgrid dynamic-linq entity-framework-4 asp.net-mvc-3
我正在使用Entity Framework 4构建一个ASP.Net MVC 3应用程序.当执行下面两段代码时,两个变量(query1和query2)的返回类型都是
System.Data.Objects.ObjectQuery<Asset.Model.Equipment>
Run Code Online (Sandbox Code Playgroud)
Query1使用ObjectContext的直接实例,但是,Query2使用存储库模式,即它在EquipmentService中调用GetEquipment,后者又在Equipment Repository中调用相同的命名方法.Service和Repository中的两个方法都返回
IQueryable<Equipment>
Run Code Online (Sandbox Code Playgroud)
如何,这是我的问题,为什么query2只有在我包含时才会起作用
using System.Linq.Dynamic;
Run Code Online (Sandbox Code Playgroud)
在我的控制器的顶部
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);
Run Code Online (Sandbox Code Playgroud)
如果我从我的控制器omitt System.Linq.Dynamic,我在Query2中得到一个错误
.OrderBy(sidx + " " + sord)
Run Code Online (Sandbox Code Playgroud)
哪个州
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
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么query1可以工作而不必使用System.Linq.Dynamic,但是query2需要它来执行?
感谢大家.
在第一个查询中context.Equipments有类型ObjectQuery<Equipment>.的ObjectQuery<T>具有方法的OrderBy(串),其中一个需要.OrderBy("it." + sidx + " " + sord).所以第一次查询工作.
在第二个查询中,您使用equipService.GetEquipment()了该类型IQueryable<Equipment>.在IQueryable<T>仅具有扩展方法的OrderBy与Expression<Func<T, TKey>>作为参数,而不是string.因此,OrderBy与IQueryable<Equipment>你一起使用必须写出像
equipService.GetEquipment().OrderBy(e => e.equipmentID)
Run Code Online (Sandbox Code Playgroud)
但它不是你可以使用的.您需要另一种扩展方法,它可以为您提供表单中的LINQ动态查询库System.Linq.Dynamic.
在许多情况下,LINQ to Entities有许多限制,但在您的情况下,它具有LINQ to SQL的更多优势.所以我建议你留在LINQ to Entities中.我确信,通过直接在您使用的实体框架中对所有功能的本机支持,您将获得更好的性能.
因为LINQ to Entities或ObjectQuery<Equipment>支持Where(string)方法(要完全是ObjectQuery.Where(字符串谓词,params ObjectParameter []参数)方法)你可以比较容易地在jqGrid中实现过滤/搜索.用法.Where可以
.Where("it.equipmentID < 100")
Run Code Online (Sandbox Code Playgroud)
要么
.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100))
Run Code Online (Sandbox Code Playgroud)
例如(在ObjectParameter输入错误时使用"maxId"而不是"@maxId" ).
更新:在答案的 "更新"部分,你可以找到一个例子,它显示了如何根据我上面描述的想法在jqGrid中实现过滤/搜索.