如何合并两个Linq查询的两个输出?

时间:2010-10-06 22:00:13

标签: linq linq-to-sql select

我正在尝试合并这两个对象但不完全确定如何..你能帮我合并这两个结果对象吗?

 //
 // Create Linq Query for all segments in "CognosSecurity"
 //
 var userListAuthoritative = (from c in ctx.CognosSecurities
                             where (c.SecurityType == 1 || c.SecurityType == 2)
                             select new {c.SecurityType, c.LoginName , c.SecurityName}).Distinct();
 //
 // Create Linq Query for all segments in "CognosSecurity"
 //
 var userListAuthoritative3 = (from c in ctx.CognosSecurities
                              where c.SecurityType == 3 || c.SecurityType == 0
                              select new {c.SecurityType , c.LoginName }).Distinct();

我想我知道该怎么做...但是回答问题的对象类型是intstringstring SecurityType,分别为LoginNameSecurityName

如果你想知道我为什么让它们像这样被打破是因为我想在做一个不同的时候忽略一个列。以下是我要转换为SQL的SQL查询。

  select distinct SecurityType, LoginName, 'Segment'+'-'+SecurityName
FROM [NFPDW].[dbo].[CognosSecurity]
where SecurityType =1

  select distinct SecurityType, LoginName, 'Business Line'+'-'+SecurityName
FROM [NFPDW].[dbo].[CognosSecurity]
where SecurityType =2

   select distinct SecurityType, LoginName, SecurityName
FROM [NFPDW].[dbo].[CognosSecurity]
where SecurityType in (1,2)

5 个答案:

答案 0 :(得分:5)

你不能加入这些因为类型不同(首先在结果类型中有3个属性,第二个有两个属性)。

如果您可以容忍为第二个查询的第3个结果输入空值,这将有所帮助。我建议你做一个userListAuthoritative.concat(userListAuthoritative3 ) 但我认为这不会起作用,因为linq生成的匿名类型不会是同一个类,即使结构是相同的。要解决这个问题,您可以定义一个CustomType来封装元组,并在两个查询中执行select new CustomType{ ... }或使用select()以类似的方式对结果进行后处理。

实际上后一种select()方法也允许你通过在后期处理中使用null实现select到CustomType来解决参数计数不匹配。

编辑:根据下面的评论,一旦结构相同,匿名类型将是相同的。

答案 1 :(得分:1)

我认为您希望保持结果不同:

var merged = userListAuthoritative.Concat(userListAuthoritative3).Distinct();

而且,正如Mike Q指出的那样,您需要确保您的类型匹配,或者通过给匿名类型提供相同的签名,或者通过专门为此目的创建自己的POCO类。

修改

如果我理解您的编辑,您希望您的Distinct忽略SecurityName列。这是对的吗?

var userListAuthoritative = from c in ctx.CognosSecurities
                            where new[]{0,1,2,3}.Contains(c.SecurityType)
                            group new {c.SecurityType, c.LoginName, c.SecurityName}
                                by new {c.SecurityType, c.LoginName}
                            select g.FirstOrDefault();

答案 2 :(得分:0)

编辑:这假设它们属于同一类型 - 但它们不是。

userListAuthoritative.Concat(userListAuthoritative3);

答案 3 :(得分:0)

我不完全确定你的意思是合并,因为你从每个类型返回不同的(匿名)类型。以下哪些不适合您?

var userListAuthoritative = (from c in ctx.CognosSecurities
                         where (c.SecurityType == 1 || c.SecurityType == 2 || c.SecurityType == 3 || c.SecurityType == 0)
                         select new {c.SecurityType, c.LoginName , c.SecurityName}).Distinct();

答案 4 :(得分:0)

尝试以下代码,您可能需要在ctx类型中实现IEqualityComparer<T>

var merged = userListAuthoritative.Union(userListAuthoritative3);