【问题标题】:C# Lambda Entity Framework: Any way to use a predicate Lambda to choose records by row number?C# Lambda Entity Framework:有什么方法可以使用谓词 Lambda 按行号选择记录?
【发布时间】:2010-10-24 22:48:33
【问题描述】:

我想在我的存储库之外进行分页,但存储库返回 IList。由于我不想不必要地拉取数据,也不想在我的 Repositories 中创建特定的 Paging 方法,有没有办法在 Where 扩展方法中按页面过滤记录?

我想做这样的事情:

var myRecords = ProductRepo.Get( p => p.Name.StartsWith("Pepsi") &&
                                      p.Row_Number() > 9 &&
                                      p.Row_Number() < 21);

获取存储库代码(当然不处理行号):

public IList<Product> Get( Expression<Func<Product, bool>> filter = null)
{
    if( filter == null)
        return _dc.Products.ToList<Product>();
    else
        return _dc.Products.Where(filter).ToList<Product>();
}

【问题讨论】:

  • 能否提供ProductRepo.Get的实现?
  • 显然,这只能在不从存储库返回 Collection 类型或在存储库中执行 Skip and Take 的情况下完成。我想知道为什么你不能在代表 ROW_NUMBER OVER (ORDER BY) 的 SQL 中创建一个字段。我会继续寻找。

标签: c# entity-framework-4 repository-pattern


【解决方案1】:

从您的 Repository 中返回 IQueryable(不要调用 .ToList())。然后你就可以使用SkipTake了。

EF 不支持 ROWNUM。

http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/055911ff-6db6-48cb-8e50-bd6415b7eefe/

【讨论】:

  • :) 可以说返回 IList 的存储库是要求的一部分。我知道 SQL 服务器有一个 ROW_NUMBER() 函数。我只是好奇我们如何将它添加到 where 子句中?
【解决方案2】:

喜欢吗?

var myRecords = ProductRepo.Get( p => p.Name.StartsWith("Pepsi") ).Skip(9).Take(12);

【讨论】:

  • 问题是 .Get 将所有记录检索到一个列表中。 .Skip 和 .Take 将过滤已经检索到的记录。如果在 Where 子句中完成,跳过的记录永远不会离开数据库。
  • 不要在没有 take & skip 的情况下将其转换为函数内的 List。
  • 这才是问题的根源。假设您返回一个 IList 并且您在存储库中没有 Take 和 Skip,您如何实现相同的效果?
  • 选择 ROW_NUMBER() over (order by ID) 作为行,* from Table。有什么办法可以在 EF 中得到这个?然后我可以在 where 语句中使用它 (p => p.row >9 && p.row
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多