gpt4 book ai didi

entity-framework-4 - LINQ 动态查询库

转载 作者:行者123 更新时间:2023-12-04 07:59:46 24 4
gpt4 key购买 nike

我正在使用 Entity Framework 4 构建一个 ASP.Net MVC 3 应用程序。当执行下面的两段代码时,两个变量(query1 和 query2)的返回类型都是

System.Data.Objects.ObjectQuery<Asset.Model.Equipment>

Query1 使用 ObjectContext 的直接实例,而 Query2 使用存储库模式,即它调用 EquipmentService 中的 GetEquipment,后者又调用 Equipment Repository 中的同名方法。 Service 和 Repository 中的方法都返回
IQueryable<Equipment>

如何,这是我的问题,为什么 query2 仅在我包含时才起作用
using System.Linq.Dynamic;

在我的 Controller 顶部
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);

如果我从 Controller 中省略 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 需要它来执行?

谢谢大家。

最佳答案

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

在第二个查询中,您使用 equipService.GetEquipment()类型 IQueryable<Equipment> . IQueryable<T>只有扩展方法 OrderByExpression<Func<T, TKey>>作为参数而不是 string .所以要使用 OrderByIQueryable<Equipment>你必须写一些类似的东西

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

但这不是您可以使用的。您需要另一种扩展方法,它可以为您提供形式 System.Linq.Dynamic 的 LINQ 动态查询库。 .

在许多情况下,LINQ to Entities 具有 many restrictions ,但在您的情况下,它比 LINQ to SQL 具有更多优势。所以我建议你在你的情况下使用 LINQ to Entities。我相信,由于直接在您使用的 Entity Framework 中对所有功能的 native 支持,您将获得更好的性能。

因为 LINQ to Entities 或 ObjectQuery<Equipment>支持 Where(string)方法(准确地说是 ObjectQuery.Where(string predicate, params ObjectParameter[] parameters) 方法),您可以相对容易地在 jqGrid 中实现过滤/搜索。 .Where的用法可
.Where("it.equipmentID < 100")

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

例如(在 ObjectParameter 中使用“maxId”而不是“@maxId”不是输入错误)。

更新 :在 the answer 的“更新”部分您可以找到 the example它展示了如何根据我上面描述的想法在 jqGrid 中实现过滤/搜索。

关于entity-framework-4 - LINQ 动态查询库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5140809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com