EF Left соединяет таблицу с двумя свойствами в сочетании с оператором case - PullRequest
4 голосов
/ 10 января 2012

Я пытаюсь написать запрос для базы данных, которая оставит соединение таблицы с таблицей поиска, и результаты будут возвращены на основе оператора case.

В обычном SQL запрос будет выглядетьнапример:

SELECT chis_id, chis_detail, cilt.mhcatID, cilt.mhtID, 'TheFileName' =
CASE  
    WHEN cilt.mhcatID IS NOT NULL AND cilt.mhtID IS NOT NULL THEN chis_linked_filename
    END
FROM chis
    LEFT JOIN cilt on cilt.mhcatID = chis.mhcat_id AND cilt.mhtID = chis.mht_id 
WHERE cch_id = 50

chis - это запрашиваемая таблица, cilt - это справочная таблица, в результате она не содержит никаких связей с внешним ключом для chis (chis имеет существующие FK для mhtи таблицы mhcat по mhtID и mhcatID соответственно).

Запрос будет использоваться для возврата списка обновлений истории для записи.Если соединение с таблицей поиска cilt выполнено успешно, это означает, что вызывающий запрос будет иметь разрешение на просмотр имени файла любых связанных файлов для обновлений истории.

Хотя во время моего исследования я обнаружил различные сообщенияздесь, относительно того, как делать операторы case и оставленные объединения в запросах Linq to Entity, я не смог понять, как объединить два разных поля.Это возможно?

Ответы [ 2 ]

6 голосов
/ 10 января 2012

Вам необходимо присоединиться к анонимному типу с соответствующими именами полей, например:

var query = from x in context.Table1
            join y in context.Table2
            on new { x.Field1, x.Field2 } equals new { y.Field1, y.Field2 }
            select {...};

Полный рабочий пример использования дополнительного from вместо join будет выглядеть примерно так:

var query = from chis in context.Chis
            from clit in context.Clit
                                .Where(x => x.mhcatID = chis.mhcat_id)
                                .Where(x =>  x.mhtID = chis.mht_id)
                                .DefaultIfEmpty()
            select new
            {
              chis.id, 
              chis.detail, 
              cilt.mhcatID, 
              cilt.mhtID,
              TheFileName = (cilt.mhcatID != null && cilt.mhtID != null) ? chis.linked_filename : null
            };
1 голос
/ 11 января 2012

Исходя из того, что предложил Aducci, я использовал групповое объединение и DefaultIsEmpty () для получения желаемых результатов. По какой-то причине я не смог заставить DefaultIfEmpty () работать неправильно самостоятельно, и в результате SQL использовал внутреннее соединение вместо левого.

Вот последний код, который я использовал для работы левого соединения:

var query = (from chis in context.chis
             join cilt in context.cilts on new { MHT = chis.mht_id, MHTCAT = chis.mhcat_id } equals new { MHT = cilt.mhtID, MHTCAT = cilt.mhcatID } into tempCilts
             from tempCilt in tempCilts.DefaultIfEmpty()
             where chis.cch_id == 50
             select new { 
                             chisID = chis.chis_id, 
                             detail = chis.chis_detail, 
                             filename = chis.chis_linked_filename, 
                             TheFileName = (tempCilt.mhcatID != null && tempCilt.mhtID != null ? chis.chis_linked_filename : null), 
                               mhtID = chis.mht_id, 
                               mhtcatID = chis.mhcat_id 
                        }).ToList();
...