2015-03-24 3 views
0

Я обращаюсь к серверу SQL и серверу MySQL, а затем выполняю левое соединение на результирующем SQL-файле, используя результирующий MySQL-тип данных.C# left join two datatables

Тем не менее, я получаю сообщение об ошибке при попытке создать новый datatable с объединенными данными.

Эти структуры таблиц:

SqlDataTable   MySqlDataTable 
-------------   --------------- 
UserID, Field1   SiteUserID, Field2 
200, 12    200,  25 

И это мой фрагмент кода. Я получаю «из контекста» погрешность «mySqlDataRows» на втором в последнюю строку:

var dtResult = new DataTable(); 
dtResult.Columns.Add("UserID", typeof (int)); 
dtResult.Columns.Add("Field1", typeof (string)); 
dtResult.Columns.Add("Field2", typeof (int)); 

var result = from sqlDataRows in sqlDataTable.AsEnumerable() 
    join mySqlDataRows in mySqlDataTable.AsEnumerable() 
    on sqlDataRows.Field<string>("UserID") equals mySqlDataRows.Field<string>("SiteUserID") into lj 
    from r in lj.DefaultIfEmpty() 
    select dtResult.LoadDataRow(new object[] 
    { 
     sqlDataRows.Field<int>("UserID"), 
     sqlDataRows.Field<string>("Field1"), 
     r == null ? 0 : mySqlDataRows.Field<int>("Field2") //The name 'mySqlDataRows' does not exist in the current context 
    }, false); 
+0

Вы можете быть лучше делать это вручную, вместо того, чтобы пытаться быть фантазии и делать это все в одном большом заявлении LINQ. Если вы извлекаете оба набора данных в коллекции сильно типизированных объектов, затем перебираете один из них при поиске другого для соответствия и объединяете их в лучшую строго типизированную коллекцию, было бы намного яснее, что вы делаете , и, вероятно, будет работать точно так же, так как LINQ будет делать за кулисами в любом случае. –

+0

Я пытаюсь избежать этого маршрута, потому что я хотел бы ознакомиться с LINQ и предпочесть краткость языка в этой форме. – blizz

ответ

2

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

var result = from sqlDataRows in sqlDataTable.AsEnumerable() 
        join mySqlDataRows in mySqlDataTable.AsEnumerable() 
         on sqlDataRows.Field<string>("UserID") equals mySqlDataRows.Field<string>("SiteUserID") into lj 
        from r in lj.DefaultIfEmpty() 
        select dtResult.LoadDataRow(new object[] 
        { 
         r.Field<int>("UserID"), 
         r.Field<string>("Field1"), 
         r == null ? 0 : r.Field<int>("Field2") 
         //The name 'mySqlDataRows' does not exist in the current context 
        }, false); 

Проблема заключается в том, что r содержит только столбцы в таблице mySqlDataRows, потому что вы используете into заявление. Зачем это нужно: from r in sqlDataRows.DefaultIfEmpty()? я выкладываю ниже код, который работает:

var result = from sqlDataRows in sqlDataTable.AsEnumerable() 
       join mySqlDataRows in mySqlDataTable.AsEnumerable() 
        on sqlDataRows.Field<int>("UserID") equals mySqlDataRows.Field<int>("SiteUserID") 
       select dtResult.LoadDataRow(new object[] 
       { 
        sqlDataRows.Field<int>("UserID"), 
        sqlDataRows.Field<string>("Field1"), 
        mySqlDataRows == null ? 0 : mySqlDataRows.Field<int>("Field2") 
       }, false); 
+0

Оба эти решения не работают. Я получаю данные, имеющие нулевые строки, несмотря на то, что sqlDataTable и mySqlDataTable заполнены несколькими строками. – blizz

+0

И btw Мне нужно это, чтобы сохранить исходный sqlDataTable и просто добавить в записи из mySqlDataTable, где когда-либо sqlDataTable.UserID == mySqlDataTable.SiteUserID – blizz