2012-05-31 3 views
0

Я просто пытаюсь работать как простой союз на 2 Linq запросов, как показано ниже:LINQ Union Error - тип не может быть выведен

var results1 = from a in dt.AsEnumerable() 
       where array1.Contains([COL_1]) 
       select new 
       { 
        a = a.Key 
       }; 


var results2 = from b in dt.AsEnumerable() 
       where array2.Contains([COL_2]) 
       select new 
       { 
        b = b.Key 
       }; 

var concatResults = results1.Union(results2); 

Но я получаю следующее сообщение об ошибке:

The type arguments for method 'System.Linq.Enumerable.Union(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Может ли кто-нибудь дать мне понять, как решить эту проблему?

Заранее спасибо

CM

ответ

2

Вы пытаетесь объединения двух различных (анонимные) типов, которые не возможно. Вы можете создать свой собственный тип для хранения своего значения Key, чтобы оба запроса проецировались на один и тот же тип.

public class MyType 
{ 
    string Key { get; set; } 
} 

var results1 = from a in dt.AsEnumerable() 
        where array1.Contains([COL_1]) 
        select new MyType 
        { 
         Key = a.Key 
        }; 

т.д.

+0

Хорошо, спасибо за ваш ответ. Почему они разных типов? Запрос из той же таблицы ... Извините, что спросила, им действительно пытаются преодолеть препятствие невежества здесь! – CatchingMonkey

+0

Типы создаются компилятором, и их типы свойств выводятся из назначений и их имен из имен. В вашем случае у вас есть один анонимный тип с свойством и один с свойством b. Вы можете либо быть явным с вашим собственным типом, либо сделать оба анонимных типа использовать одни и те же имена и типы свойств. – devdigital

1

Для компилятор, чтобы успешно определить тип результата объединения, два анонимных типа, возвращаемые Query1 и Query2 должны быть идентичными (на самом деле, компилятор генерирует один тип).

Переименуйте свойства анонимного типа, чтобы оба использовали a или b, без смешивания. a.Key и b.Key также должны быть одного типа.

var results1 = from a in dt.AsEnumerable() 
      join arr1 in array1 on a.Field<int>("Col1") equals arr1 
      select new 
      { 
       Key = a.Field<int>("Key") 
      }; 


var results2 = from b in dt.AsEnumerable() 
      join arr1 in array1 on b.Field<int>("Col2") equals arr1 
      select new 
      { 
       Key = b.Field<int>("Key") 
      }; 

var unioned = results1.Union(results2);