Условное присоединение в LINQ? - PullRequest
4 голосов
/ 01 июня 2010

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

TableA
idA
valueA
idB

TableB
idB
valueB

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

Ответы [ 4 ]

5 голосов
/ 01 июня 2010

Вот синтаксическая версия выражения запроса левого соединения, чтобы продолжить ответ 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 голосов
/ 01 июня 2010

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

 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 голосов
/ 01 июня 2010

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

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 };
0 голосов
/ 01 июня 2010

Вы можете выполнить левое внешнее объединение в 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>

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