如何根据ID列表对EF返回的对象进行排序?

时间:2016-06-22 08:04:01

标签: c# entity-framework asp.net-web-api

我有两张桌子:

User {
    PK: UserId
    ...
}

Product {
    PK: ProductId, 
    FK: UserId
    ...
}

我有一个随机格式的ProductId列表。我不想对输出结果进行排序,我也希望为每个产品ID包含用户数据。

以下代码以排序格式提供数据。我怎样才能避免这种排序?我希望对象列表与我们的产品列表的顺序相同。

List<Tables.Product> tblProductList =
    repo.Products
        .Include("User")
        .Where(x => productIdList.Contains(x.ProductId))
        .ToList(); 

2 个答案:

答案 0 :(得分:2)

  

我希望对象列表与产品列表的顺序相同。

我假设我们的产品列表是指用于过滤的productIdList变量。

你不能在LINQ to Entities中这样做,所以你必须切换到LINQ to Objects并在内存中进行排序。

一种方法是使用IndexOf方法:

var tblProductList =
    repo.Products
        .Include("User")
        .Where(x => productIdList.Contains(x.ProductId))
        .AsEnumerable() // Switch to LINQ to Objects context
        .OrderBy(x => productIdList.IndexOf(x.ProductId))
        .ToList();

另一个更高效的方法(当productIdList很大时)可以使用中间字典:

var productsById =
    repo.Products
        .Include("User")
        .Where(x => productIdList.Contains(x.ProductId))
        .ToDictionary(x => x.ProductId);

var tblProductList = productIdList
    .Select(productId => productsById[productId])
    .ToList();

答案 1 :(得分:-1)

var tblProductList=(from product in repo.Products
                   join user in repo.Users on product.UserId equals user.UserId  
                   select new { Product=product,User=user}).toList();