Linq To Entities - OrderBy

时间:2011-02-25 09:17:35

标签: entity-framework-4 asp.net-mvc-3 jqgrid linq-to-entities entity

我正在关注使用JQGrid和ASP.Net MVC的Phil Haacks教程。我的应用程序是使用Entity Framework 4的ASP.Net MVC 3。

我有以下代码来执行我的数据的排序和分页,返回到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.

查询在我的服务层中调用方法GetAllEquipment(),看起来像这样

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;
    }

我可以通过在我的控制器方法中创建objectcontext的实例并使用此代码来解决问题

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);

        }

但是,我真的不想这样做,而是希望保留我在整个应用程序中用于所有数据库交互的存储库模式。

关于如何解决此问题的任何想法?

感谢所有人。

2 个答案:

答案 0 :(得分:1)

您的存储库非常错误。它始终将所有数据从db加载到应用程序,并在Web服务器的内存中执行分页和排序。这与您的上一个查询有很大不同,后者在db中执行排序和分页,只返回一页的数据。如果要在控制器中创建查询,则存储库和服务必须返回IQueryable,并且它们不能调用ToList。调用ToList执行当前查询。

答案 1 :(得分:1)

我建议您使用PropertyInfoGetPropertyFieldInfoGetField取决于您的数据模型。如果您可以在没有任何扩展的情况下实施OrderBy操作。有关详细信息,请参阅the answer

更新:我再次仔细阅读您的问题。在我看来,你的问题在GetAllEquipment方法中。它返回List<Equipment>而不是IQueryable<Equipment>。因此,GetAllEquipment方法获取“SELECT * FROM it.Equipment”并将数据作为不再是实体List返回。使用equipService.GetAllEquipment().AsQueryable(),您将拥有IQueryable<Equipment>个对象,但您不会更多地使用LINQ to Entity,因此您应该不使用“它。”名字前面的前缀。