Каков тип возврата для универсального списка, возвращающего анонимный 2-строчный тип? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть эта функция:

public static List<string> JoinDataTablesMultipleColumns(DataTable dt1, DataTable dt2, string col1, string col2, string col3) {
 var multiJoin = from table1 in dt1.AsEnumerable()
 join table2 in dt2.AsEnumerable()
 on new {
   Col1 = table1.Field < string > (col1),
   Col2 = table1.Field < string > (col2),
   Col3 = table1.Field < string > (col3),
 }
 equals new {
   Col1 = table2.Field < string > (col1),
   Col2 = table2.Field < string > (col2),
   Col3 = table2.Field < string > (col3),
 }
 select new {
   SeriesID = table1.Field < string > ("SeriesID"),
   CatID = table2.Field < string > ("CatID")
 };

 //if ( multiJoin != null )
 //   return multiJoin.ToList();
 //else
 return null;
}

Это работает отлично, за исключением того, что у меня неправильный тип возврата. Единственный способ, которым я могу скомпилировать и запустить его, это вернуть null. Когда я останавливаю отладчик перед возвратом и проверяю multiJoin.ToList() в watch window, это именно то, что я хочу:

enter image description here

Но тип возвращаемого значения неправильный. Я продолжаю пытаться List<string, string>, но это не скомпилируется. Наверное, простая вещь, но я застрял. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Как вы заметили, вы получаете список анонимного типа. Анонимные типы не предназначены для вычеркивания из методов, которые их создают . Есть способы заставить это работать, но они запутанные, сложные и загадочные.

Не пытайтесь делать это с анонимными типами. В C # 7 вы можете использовать тип кортежа и вернуть List<(string, string)>, а затем сделать

select (table1.Field<string>("SeriesID"), table2.Field<string>("CatID"))

В других версиях C # создайте номинальную пару типа и создайте ее экземпляр в предложении select.

0 голосов
/ 08 ноября 2018

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

public class Item
{
    public string SeriesID { get; set;}
    //...
}

и используйте его вместо анонимного типа, который вы в данный момент выбираете в конце запроса.

...select new Item {
   SeriesID = table1.Field < string > ("SeriesID"),
   CatID = table2.Field < string > ("CatID")
 };
...