【问题标题】:Find record position in Linq2Sql or Entity framework query在 Linq2Sql 或实体框架查询中查找记录位置
【发布时间】:2016-12-10 20:59:01
【问题描述】:

我正在尝试实现IBindingListView,它将与任何作为数据源的Linq 查询一起使用,但我被困在Find(PropertyDescriptor, Object) 方法的实现上,该方法应该找到包含特定属性中某些值的记录位置。

我不想遍历内存中的所有记录。我希望数据库来做到这一点。
很遗憾,Linq 不支持 row_number() SQL 函数,我无法在保留排序和过滤的同时找到任何其他方法。

换句话说:
给定

class Entity
{
   public string StringProperty {get; set;}
   public int IntProperty {get; set;}
   public string StringProperty2 {get; set;}
}

|StringProperty | IntProperty | StringProperty2|
|ccc            | 102         | value 2        |
|aaa            | 100         | value 0        |
|ddd            | 103         | value 3        |
|aaa            | 101         | value 1        |

查询

var query = from e in Entities
            where e.IntProperty > 100
            orderby e.StringProperty

这给了我

|StringProperty | IntProperty | StringProperty2|
|bbb            | 101         | value 1        |
|ccc            | 102         | value 2        |
|ddd            | 103         | value 3        |

带有参数 StringProperty2 = 'value 2' 的 Find() 应该返回 1(基于 0 的索引),但应该使用 Linq 找到它,以便在数据库中执行。

如果执行 2 或 3 个查询,我没有问题,但请不要假设我对主键或特定 Linq 提供程序一无所知。我们可以假设,如果 Linq to SQL 或 Entity Framework 能够将某些内容转换为 SQL,那么它就可以使用。

如何实现 IBindingListView.Find() 方法,该方法适用于任何 Linq 查询作为数据源?

【问题讨论】:

  • 但是回到数据库中查找本地列表中可以轻松获取的内容有点奇怪。
  • @Arnold 除非您有一百万条记录要在网格中显示,或者您的代码所在的层不应该对 GUI 分页等有任何了解。

标签: c# .net entity-framework linq linq-to-sql


【解决方案1】:

您可以使用 lambda 表达式形式来捕获行数据和行索引。 示例:

var query = youCollection
            .Select((r, i) => new {Row = r, Index = i});

【讨论】:

  • 索引只有在我们获取所有没有过滤器的数据时才有效,如果我们使用过滤器,索引不会显示记录的位置。但是内存中加载的数据。
猜你喜欢
  • 2013-06-02
  • 2014-10-13
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多