2010-06-01 3 views
4

Я пытаюсь написать запрос, который захватывает информацию из одной базы данных и присоединяет ее к информации в другой базе данных.Условное соединение в LINQ?

TableA 
idA 
valueA 
idB 

TableB 
idB 
valueB 

Хитрость в том, что в TableA, IDB не всегда определяется, поэтому, когда я нормальный присоединиться, я только получить результаты, где TableA имеет значение IDB. Я хочу, чтобы иметь возможность захватывать всю информацию из TableA, даже если она не имеет соответствующего значения idB.

ответ

5

Вот синтаксическая версия синтаксиса запроса слева, чтобы следить за ответом tvanfosson.

var query = from rowA in db.TableA 
      join rowB in db.TableB 
      on rowA.idB equals rowB.idB into b 
      from item in b.DefaultIfEmpty() 
      select new 
      { 
       idA = rowA.idA, 
       valueA = rowA.valueA, 
       idB = rowA.idB, 
       valueB = item != null ? item.valueB : 0 // or other default value 
      }; 
3

Используйте левое внешнее соединение, проверяя, имеет ли значение, возвращенное с правой стороны, значение null и значение по умолчанию для этого случая.

var q = db.TableA.Join(db.TableA, 
         a => a.idB, 
         b => b.idB, 
         (a,b) => new 
            { 
             A = a.ValueA, 
             B = b == null ? null : b.ValueB 
            }); 
+0

Хорошо, это прекрасно. Я всегда задавался вопросом, какая разница между левым соединением и объединением была, и теперь я знаю! Благодаря! – sooprise

0

Вы можете сделать левую внешнее соединение в LINQ с SelectMany (прямым вызовом Queryable методы) или в синтаксисе понимания join ... into:

var results = from a in db.TableA 
       join b in db.TableB on a.idB equals b.idB 
       into found 
       select new { 
       A = a, 
       Bs = found 
       }; 

В выходе Bs будет IEnumerable<typeof-db-TableB>

0

Соединения слева Пример:

var leftOuterJoinQuery = 
    from category in categories 
    join prod in products on category.ID equals prod.CategoryID into prodGroup 
    from item in prodGroup.DefaultIfEmpty(new Product{Name = String.Empty, CategoryID = 0}) 
     select new { CatName = category.Name, ProdName = item.Name }; 
+2

вопиющая копия/вставка из MSDN;) –

+0

Ну, это работает, и это помогло мне в моем первом опыте LINQ. –

Смежные вопросы