LINQ 动态查询库

7

我正在构建一个使用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>

怎么样,这是我的问题,为什么只有在包含“query1”时,“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);

如果我在控制器中省略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

有人知道为什么不使用System.Linq.Dynamic查询1可以工作,但查询2需要它才能执行吗?

谢谢大家。

2个回答

6
在第一个查询中,context.Equipments 的类型为 ObjectQuery<Equipment>ObjectQuery<T> 具有方法 OrderBy(string),这是需要 .OrderBy("it." + sidx + " " + sord) 的方法。因此第一个查询可以正常工作。
在第二个查询中,您使用了类型为 IQueryable<Equipment>equipService.GetEquipment()IQueryable<T> 仅具有带有 Expression<Func<T, TKey>> 参数的扩展方法 OrderBy,而不是 string。因此,要在 IQueryable<Equipment> 中使用 OrderBy,您必须编写类似以下内容的代码:
equipService.GetEquipment().OrderBy(e => e.equipmentID)

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

在许多情况下,LINQ to Entities有许多限制,但在您的情况下,它比LINQ to SQL更具优势。因此,我建议您在您的情况下继续使用LINQ to Entities。我相信,在您使用的Entity Framework中直接支持所有函数的本地支持的方式中,您将获得更好的性能。

由于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"并非打字错误。
更新:在答案的"更新"部分,您可以找到示例,它展示了如何基于我上面描述的想法在jqGrid中实现过滤/搜索。

@tgriffiths:在答案中,我展示了如何在jqGrid中实现过滤/搜索,可用于工具栏搜索高级搜索。我已更新我的答案,并提供了相应的链接。 - Oleg

4
"

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

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接