Entity framework 4 Linq到实体-OrderBy

Entity framework 4 Linq到实体-OrderBy,entity-framework-4,asp.net-mvc-3,jqgrid,linq-to-entities,entity,Entity Framework 4,Asp.net Mvc 3,Jqgrid,Linq To Entities,Entity,我正在学习PhilHaacks关于在ASP.NETMVC中使用JQGrid的教程。我的应用程序是ASP.NETMVC3,使用实体框架4 我有以下代码来对返回到JQGrid的数据执行排序和分页 var query = equipService.GetAllEquipment().AsQueryable() .OrderBy("it." + sidx + " " + sord) .Skip(pageIndex * pageSize)

我正在学习PhilHaacks关于在ASP.NETMVC中使用JQGrid的教程。我的应用程序是ASP.NETMVC3,使用实体框架4

我有以下代码来对返回到JQGrid的数据执行排序和分页

var query = equipService.GetAllEquipment().AsQueryable()
                .OrderBy("it." + sidx + " " + sord)
                .Skip(pageIndex * pageSize)
                .Take(pageSize);
但是,这段代码在.OrderBy(“it.”+sidx+“”+sord)行创建了一个错误。错误是

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.
但是,我并不真的想这样做,而是希望在整个应用程序中使用存储库模式来进行所有数据库交互

有没有办法解决这个问题


一如既往地感谢大家。

您的存储库大错特错了。它总是将所有数据从数据库加载到应用程序,并在web服务器的内存中执行分页和排序。这与上一个查询有很大区别,上一个查询在db中执行排序和分页,并且只返回一个页面的数据。若要在控制器中创建查询,存储库和服务都必须返回IQueryable,并且不能调用ToList。调用ToList执行当前查询。

我建议您使用
PropertyInfo
GetProperty
FieldInfo
GetField
取决于您的数据模型。在这种情况下,您可以实现无需任何扩展的
OrderBy
操作。有关详细信息,请参阅


更新:我再次仔细阅读了你的问题。在我看来,您的问题在
GetAllEquipment
方法中。它返回
List
,而不是
IQueryable
。因此,
GetAllEquipment
方法获取“SELECT*FROM it.device”,并将数据作为
列表返回,该列表是没有更多实体的。使用
equipment.GetAllEquipment().AsQueryable()
您将拥有
IQueryable
对象,但您将不再使用LINQ to Entity,因此您应该不要在名称之前使用“it.”前缀。

我将我的服务和存储库方法都更改为返回IQueryable,然后将控制器中的调用更改为IQueryable query=equipService.GetEquipment().OrderBy(sidx+“”+sord).Skip(pageIndex*pageSize).Take(pageSize);但是,我仍然有上面提到的错误。有什么想法吗?你在使用一些特殊的Linq扩展,比如动态Linq吗?因为common OrderBy不允许将排序指定为字符串。是的,我使用的是动态Linq,正如您在下面一行中所看到的。OrderBy(“it.”+sidx+“”+sord)我将字符串连接在一起。@Oleg。我更新了存储库和服务类以返回IQueryable。我还从OrderBy子句中删除了“it.”。我的查询现在看起来像这个var query=equipService.GetEquipment().OrderBy(sidx+“”+sord).Skip(pageIndex*pageSize).Take(pageSize);但是同样的错误仍然存在。不,我的代码仍然不工作。我仍然在.OrderBy(sidx+“”+sord)@Oleg上获得错误:如果我将查询更改为…var query=EquipmService.GetEquipment().OrderBy(e=>e.equipmentID).Skip(pageIndex*pageSize).Take(pageSize);这很有效。因此,我的问题似乎是我正在使用的动态OrderBy子句…@tgriffiths:您是否尝试使用
GetProperty
实现数据排序,就像我在中所做的那样?@Oleg:我终于解决了这个问题。我必须下载此处所述的动态查询库,然后在我的控件顶部下载reference System.Linq.Dynamic。我的代码现在可以工作了:)谢谢你的帮助。
.OrderBy(“it.+sidx+”+sord)
不是动态LINQ语法。这是ESQL/QueryBuilder语法。你知道你在调用哪个方法吗?@Craig:我必须下载动态查询库,如这里所述,weblogs.asp.net/scottgu/archive/2008/01/07/…,然后在我的控件顶部引用System.Linq.Dynamic。我的代码现在可以工作了:)谢谢。
public List<Equipment> GetAllEquipment()
    {
        List<Equipment> equipList = new List<Equipment>();
        equipList = equipRepository.GetAllEquipment();

        return equipList;
    }
public List<Equipment> GetAllEquipment()
    {
        var query = (from e in Data.DBEntities.Equipments
                     select e).ToList();

        return query;
    }
using (AssetEntities context = new AssetEntities())
        {
            int pageIndex = Convert.ToInt32(page) - 1;
            int pageSize = rows;
            int totalRecords = context.Equipments.Count();
            int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);


            var query = context.Equipments
              .OrderBy("it." + sidx + " " + sord)
              .Skip(pageIndex * pageSize)
              .Take(pageSize);

        }