Самостоятельно присоединиться к LINQ - PullRequest
0 голосов
/ 03 февраля 2019
SELECT 
    FW1.id, count(*) 
FROM 
    firmware FW1 
LEFT JOIN
    firmware FW2 ON FW1.firmware_group_id = FW2.firmware_group_id
                 AND FW1.br_date < FW2.br_date 
                 AND FW2.[public]= '1'  
GROUP BY
    FW1.id

Я хочу преобразовать в запрос linq.Как я знаю, меньше чем символ не может быть преобразован в запрос Linq.Подскажите пожалуйста как это сделать.У меня есть строковая дата, и мне нужно сравнить в linq.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Конечно, можно использовать символ <.Просто используйте синтаксис метода вместо синтаксиса запроса!

Каждый FW1 имеет ноль или более FW2s.Каждый FW2 принадлежит ровно одному FW1.Это один-ко-многим реализовано с использованием внешнего ключа firmware_group_id.

Очевидно, вы хотите, чтобы все FW1s, каждый с номером его FW2s, имели свойство public со значением, равным 1, и свойство br-date больше, чем значение br-date из FW1.

Всякий раз, когда вы хотите, чтобы элемент с его многочисленными подпунктами (с использованием внешнего ключа), например, s School с его учениками, Customer с его заказами, Book с его страницамиВам понадобится Enumerable.GroupJoin

var result = FW1.GroupJoin(FW2,      // GroupJoin FW1 and FW2
    fw1 => fw1.firmware_group_id,    // from fw1 take the primary key firmware_group_id
    fw2 => fw2.firmware_group_id,    // from fw2 take the foreing key firmware_group_id

    (fw1, fw2s) => new               // from every fw1, with all its matching fw2s 
    {                                // make one new object containing the following properties:
        Id = fw1.Id,

        // Count the fw2s of this fw1 that have public == 1
        // and a date larger than fw1.date
        Count = fw2.Where(fw2 => fw2.Public == 1 && fw1.br_date < fw2.br_date)
                   .Count(),         
    });

Примечание:

0 голосов
/ 04 февраля 2019

Как вы сказали, Linq не поддерживает другие типы join за пределами EquiJoin. Документы довольно ясно, что вы можете сделать, чтобы обойти это:

  • вы можете использовать простое перекрестное соединение (декартово произведение), а затем применять в предложении where условия дляваше не равнозначно.
  • Или вы можете использовать временную переменную для хранения новой таблицы только с теми атрибутами, которые вам нужны для вашего запроса, и, как и раньше, применять условия в предложении where.

В вашем случае возможный запрос Linq может быть таким:

from f1 in firmwares
from f2 in firmwares
let f1_date = DateTime.Parse(f1.Dt)
let f2_date = DateTime.Parse(f2.Dt)
where f1.Group_Id == f2.Group_Id && f1_date < f2_date
group f1 by f1.Id into fres
select new {
    Id = fres.Key,
    Count = fres.Count()
};

Однако я все еще думаю, как эмулировать LEFT JOIN без приведения его к групповому соединению.

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