Как я могу реализовать объединение с использованием 2 выражений в Linq с учетом нулевых значений? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь создать запрос Linq, который будет возвращать Ienumerable в .net Core.

У меня есть 2 таблицы: одна, которая определяет элементы множественного выбора для внешнего интерфейса, а другая, которая фактически имеетнесколько выбранных значений сохраняются из пользовательского ввода.

Я ударился о кирпичную стену соединением Linq, которое имеет более одного условия.Сначала я пройду свой путь, но я надеюсь, что кто-то, кто сделал то, что я делаю, может поделиться со мной тем, что его / ее лучшее решение было для SelectList.

[RAW SQL]
SELECT 
      ot.OrganizationTypeText
    , ot.OrganizationTypeValue
    , si.OrganizationTypeSelectedItemValue
    , CASE WHEN si.OrganizationTypeSelectedItemValue IS NULL then 0
      ELSE 1
      END AS selected 
FROM [Organization.OrganizationType] ot
LEFT JOIN [Organization.OrganizationTypeSelectedItem] si ON (si.OrganizationID = 1) 
    AND (si.OrganizationTypeSelectedItemValue = ot.OrganizationTypeValue)
ORDER BY ot.OrganizationTypeDisplayOrder

[LINQ QUERY SO FAR]
var query = from ot in _db.OrganizationType
    join si in _db.OrganizationTypeSelectedItem on ot.OrganizationTypeValue equals si
        .OrganizationTypeSelectedItemValue
    select new SelectListItem
    {
        Text = ot.OrganizationTypeText,
        Value = ot.OrganizationTypeValue.ToString(),
        Selected = (si.OrganizationTypeSelectedItemValue == null) ? false : true
    };

[DESIRED RETURN RESULTS TO WORK WITH]
Text        Value   debug   Selected
Customer        1       1          1
Partner         2    NULL          0
Donor           3       3          1
Sponsor         4       4          1
Vendor          5    NULL          0
Lead            6    NULL          0
Prospect        7    NULL          0

Я ожидалэто так же просто, как в сыром SQL, но я только что обнаружил, что Linq не любит множественные выражения в соединениях.Нулевое значение, которое нужно интерпретировать как ложно выбранный элемент, вызывает у меня головные боли при попытках выбора, которые я пытаюсь выполнить.

1 Ответ

0 голосов
/ 13 июня 2019

Линк, который я использовал, находится в выражении лямда.

Моя работа заключается в том, чтобы отфильтровать OrganizationTypeSelectedItem, а затем соединиться только с таблицей OrganizationType.

Надеюсь, это поможет.

var query = _db.OrganizationType
               .LeftJoin(
                _db.OrganizationTypeSelectedItem.Where(si=>si.OrganizationID == 1),
                orgType => orgType.OrganizationTypeValue,
                orgSI => orgSi.OrganizationTypeSelectedItemValue,
                (orgType, orgSI) => new SelectListItem
                {
                    Text = orgType.OrganizationTypeText,
                    Value = orgType.OrganizationTypeValue.ToString(),
                    Selected = orgSI != null
                }
               ).ToList();

Какой метод LeftJoin можно записать как

public static IEnumerable<TResult> LeftJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
                                                     IEnumerable<TInner> inner,
                                                     Func<TSource, TKey> pk,
                                                     Func<TInner, TKey> fk,
                                                     Func<TSource, TInner, TResult> result)
    {
        return from s in source
               join i in inner
               on pk(s) equals fk(i) into joinData
               from left in joinData.DefaultIfEmpty()
               select result(s, left);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...