Как я могу объединить два вывода двух запросов Linq? - PullRequest
3 голосов
/ 07 октября 2010

Я пытаюсь объединить эти два объекта, но не совсем уверен, как ... Можете ли вы помочь мне объединить эти два объекта результата?

 //
 // 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();

Я думаю, что вижу, куда пойти с этим ... но чтобы ответить на вопрос, типы объектов int, string, string для SecurityType, LoginName и SecurityName соответственно

Если вам интересно, почему я так их сломал, это потому, что я хочу игнорировать один столбец, когда создаю отдельный. Вот 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 ]

5 голосов
/ 07 октября 2010

Вы не можете присоединиться к ним, потому что типы разные (у первого есть 3 свойства в результирующем типе, у второго - два).

Если вы можете допустить введение нулевого значения для 3-го результатаВторой запрос это поможет.Затем я бы предложил вам сделать userListAuthoritative.concat(userListAuthoritative3 ) НО Я думаю, что это не сработает, поскольку анонимные типы, сгенерированные linq, не будут принадлежать к одному и тому же классу, даже если структура одинакова.Чтобы решить эту проблему, вы можете либо определить CustomType для инкапсуляции кортежа и выполнить select new CustomType{ ... } в обоих запросах, либо постобработать результаты, используя select() аналогичным образом.

В действительности последний подход select () также позволитЧтобы решить проблему несоответствия счетчика параметров, добавьте select с нулем в постобработке к CustomType.

РЕДАКТИРОВАТЬ: Согласно комментарию ниже, когда структуры совпадают, анонимные типы будутто же самое.

1 голос
/ 07 октября 2010

Я предполагаю, что вы хотите, чтобы результаты различались:

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

И, как указал Майк 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();
0 голосов
/ 07 октября 2010

Попробуйте приведенный ниже код, вам может потребоваться реализовать IEqualityComparer<T> в вашем типе ctx.

var merged = userListAuthoritative.Union(userListAuthoritative3);
0 голосов
/ 07 октября 2010

Я не совсем уверен, что вы подразумеваете под слиянием, так как вы возвращаете разные (анонимные) типы от каждого.Есть ли причина, по которой у вас не работает следующее?

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();
0 голосов
/ 07 октября 2010

Редактировать : Предполагалось, что они были одного типа - но это не так.

userListAuthoritative.Concat(userListAuthoritative3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...