C# Linq实体展望下一行中的值

C# Linq实体展望下一行中的值,c#,entity-framework,linq,C#,Entity Framework,Linq,在查询实体框架数据库时,我试图根据两行中的值匹配一个条件 我当前的查询如下所示: var query = context.table.where(x => x.row > 2); 这一切都很好 我现在想要实现的是根据当前行和下一行中的值查询表,例如: var query = context.table.where(x => x.row > 2 && x.row[next row up in DB] < 2); 将示例SQL转换为LINQ到SQL:

在查询实体框架数据库时,我试图根据两行中的值匹配一个条件

我当前的查询如下所示:

var query = context.table.where(x => x.row > 2);
这一切都很好

我现在想要实现的是根据当前行和下一行中的值查询表,例如:

var query = context.table.where(x => x.row > 2 && x.row[next row up in DB] < 2);

将示例SQL转换为LINQ到SQL:

var ans = from p in t_table
          from f in t_table
          where (p.id+1) == f.id && p.column == whatever && f.column == whatever2
          select new { p, f };
这看起来并不是在SQL中生成内部连接,而是一个交叉连接,但我认为SQL引擎将适当地处理它。请注意,LINQ只能进行等连接

我没有意识到,只要equal是主运算符,就可以在LINQ联接中执行一些表达式,这将生成一个子选择和一个内部联接,这似乎要快一点:

var ans = from p in t_table
          where p.column == whatever
          let pidplus1 = p.id+1
          join f in t_table on pidplus1 equals f.id
          where f.column == whatever2
          select new { p, f };

不,您不能下载所有数据并在内存中使用它吗?定义下一步。基于什么顺序?我可以,但在我看来这是一个糟糕的选择-如果这是一张非常大的桌子怎么办?或者,如果这个查询运行了很多次呢?我可以用SQL轻松地做到这一点——这似乎是实体的一大弱点——随着时间的推移,我对它越来越失望by@IvanStoev是的,基于顺序-现在可以是任何东西-索引等-我只是想建立一个原则F对很多事情都很好,它提供了很多灵活性,但它甚至不打算替换SqlCommand等的所有用例。如果您谈论的是批量操作或其他繁重的操作,那么您可能会更关心您的执行计划,因此精心设计和调优您自己的SQL是有意义的。EF是一个很好的工具,但它并不总是适合手头的工作。我发现这种连接的唯一问题是,在较大的表上,它可能会非常慢-在某些情况下几乎慢得无法用。我认为它与LINQ的SQL非常接近,否则,我认为您将需要直接使用SQL。我同意-我认为这就是我将要做的
var ans = from p in t_table
          where p.column == whatever
          let pidplus1 = p.id+1
          join f in t_table on pidplus1 equals f.id
          where f.column == whatever2
          select new { p, f };