【问题标题】:SELECT UNTIL in SQL with Entity Framework使用实体框架在 SQL 中选择 UNTIL
【发布时间】:2013-10-20 09:27:29
【问题描述】:

我想选择行,直到找到某个数字 ID。如果我的数据是按 ID 排序的,那么问题就可以很容易地解决。

Id    Name
-----------
1     Bob
2     Eve
3     Alice
4     Michael
5     Anne
6     Mike

要在找到 ID 4 之前获取所有项目,以下 SQL 语句就足够了:

SELECT * FROM Users WHERE Id <= 4

如果数据是按名称排序的,但我仍然想在找到 Id 4 之前获取这些项目,我想不出一个好的解决方案。

Id    Name
-----------
3     Alice
5     Anne
1     Bob
2     Eve
4     Michael
6     Mike

要定义的语句的输出应该是:

Id    Name
-----------
3     Alice
5     Anne
1     Bob
2     Eve
4     Michael

编辑 1:

使用以下语句,输出几乎是我需要的,但缺少 ID 为 4 的项目。

queryable.OrderBy(o => o.Name).TakeWhile(o => o.Id != 4);

Id    Name
-----------
3     Alice
5     Anne
1     Bob
2     Eve

是否也可以包含 ID 为 4 的项目?

编辑 2:

现在我将采用这种方法:

queryable.OrderBy(o => o.Name).TakeWhile(o => o.Id != 4).Union(queryable.Where(o => o.Id == 4))

由于 ID 是唯一的,因此 UNION 语句应该没有问题。但我不确定这种说法是否最有效。

【问题讨论】:

  • 无论排序如何,select 语句仍然会返回 ID 小于或等于 4 的所有记录。
  • 我知道这一点。我的问题是要找到一个将顺序考虑在内的语句。

标签: c# sql linq entity-framework tsql


【解决方案1】:
Context.Table.OrderBy(p => p.Name).TakeWhile(p => p.id != 4);

【讨论】:

    【解决方案2】:
    var result = Users.TakeWhile((u,i)=> i == 0 || Users.ElementAt(i-1).Id != 4);
    

    另一种方法:

    var result = Users.TakeWhile(u=>u.Id!=4)
                      .Union(Users.SkipWhile(u=>u.Id!=4).Take(1));
    

    【讨论】:

    • 此语句返回 1 项。我认为 Take(1) 是没有必要的。如果我删除 Take(1) 输出几乎就是我需要的,但缺少 ID 为 4 的项目。
    • 这似乎有效,但我不太清楚为什么。你能用几句话解释一下吗? :)
    • @Moo 重点是使用ElementAt 来引用当前迭代中的前一个元素,在您的示例中6 的元素处,前一个元素是4 所以它停在那里并丢弃元素6,它之前返回的只是从开始到4的元素。
    • 谢谢,我喜欢这种方法!您如何看待“queryable.OrderBy(o => o.Name).TakeWhile(o => o.Id != 4).Union(queryable.Where(o => o.Id == 4))”。哪种说法更有效?
    • @Moo 我不认为它更好,它确实使用了 2 个查询,你也可能有更多的 4 id,第二个 Where 将返回一个项目集合(不仅仅是 1 item),所以是错误的。
    【解决方案3】:
        var results = from n in names.TakeWhile( n => n.Id != 4)
           .Union(names.Where(n => n.Id == 4)) select n;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多