使用linq连接两个集合的问题

时间:2010-10-19 17:07:34

标签: c# linq

public class A
{
   public bool Selected;
   public DateTime CreateDate;
}

我有一个A的集合,我称之为Coll,我想这样做:

Coll.Where(a => a.Selected).Concat(Coll.Where(a => !a.Selected)
.OrderBy(a => a.CreateDate))

这看起来很棒,但是如果我删除了订单部分,结果是一样的,因为Linq正在生成以下字符串

SELECT [t2].[Selected], [t2].[CreateDate]
FROM (
    SELECT [t0].[Selected], [t0].[CreateDate]
    FROM [dbo].[A] AS [t0]
    WHERE ([t0].[Selected] = 1)

    UNION ALL

    SELECT [t2].[Selected], [t2].[CreateDate]
    FROM [dbo].[A] AS [t1]
    WHERE (NOT ([t1].[Selected] = 1)) 
    ) 
AS [t2]

正如你可以看到linq生成的sql sintax中的OrderBy消失,如果有人可以提供帮助,那就太棒了。

3 个答案:

答案 0 :(得分:3)

您的括号不匹配,为pointed out by vlad。如果您拆分线条,则更容易看到:

Coll
   .Where(a => a.Selected)
   .Concat( 
        Coll.Where(a => !a.Selected).OrderBy(a => a.CreateDate)
      )

应该是:

Coll
   .Where(a => a.Selected)
   .Concat(
       Coll.Where(a => !a.Selected)
      )
   .OrderBy(a => a.CreateDate)

然而,这没有任何意义。你试图将a.Selected为真的所有成员与其错误的成员联系起来 - 基本上选择整个集合。您可以选择所有内容(删除concat)并获得相同的结果:

Coll.OrderBy(a => a.CreateDate)

编辑以回应评论:

  

我分为两种情况,因为我希望收集的第一项“选定”

在这种情况下,你应该这样做:

Coll.OrderByDescending(a => a.Selected).ThenBy(a => a.CreateDate)

答案 1 :(得分:0)

你试图订购整个系列吗?如果是这样,我认为括号放在错误的位置(下面的片段未经测试):

Coll.Where(a => a.Selected).Concat(Coll.Where(a => !a.Selected)).OrderBy(a => a.CreateDate)

答案 2 :(得分:0)

未经测试,但您可以尝试:

query1.Concat(query2).OrderBy(selector)

与在TSQL中一样,仅过滤查询的 part 是没有意义的。如果您首先需要第一组,可能会引入一个虚拟值:

query1.Select(row => new {x=1,row})
  .Concat(query2.Select(row => new {x=2,row}))
  .OrderBy(tmp => tmp.x)
  .ThenBy(tmp => tmp.row.whatever)
  .Select(tmp => tmp.row);