найдите, есть ли какая-либо пустая строка в left join linq

#asp.net-mvc #linq #razor

Вопрос:

Таблица 1 выглядит следующим образом:

 |ID  | StartDate   | FoodID  |
|----|-------------|---------|
|5   | 21 May 2021 |F1       |
|6   | 27 Sep 2021 |F2       |
 

Таблица 2 выглядит следующим образом:

 |ID2 |  ID |       Date   |  Value |
|----|-----|--------------|--------|
|1   |  5  |  21 May 2021 |  10    |
|2   |  5  |  24 May 2021 |  20    |
|3   |  5  |  25 May 2021 |  30    |
|4   |  5  |  26 May 2021 |  40    |
|5   |  5  |  Till Today  |  50    |
|6   |  6  |  27 Sep 2021 |  60    |
|7   |  6  |  Till Today  |  70    |
 

Запрос должен возвращать значение true, если в таблице 2 нет отсутствующей строки, иначе значение false. Пожалуйста, помогите в определении требуемого запроса. 22 и 23 мая-выходные дни, поэтому их можно пропустить.

 from t1 in table1
join t2 in table2 on t1.ID equals t2.ID into temp
from leftjoinvar in temp.DefaultIfEmpty()
group new {t1, t2} by new {t1.FoodID} into g
select new myVM {
    theFoodName = g.Key.FoodID,
    isRowMissingForTheFoodName = requiredQuery
}

<ol>
    @foreach (var data in Model)
    {
        <li>@data.theFoodName -- @data.isRowMissingForTheFoodName</li>
    }
</ol>
 

Для приведенного выше примера необходим результат

  1. F1 — верно
  2. F2 — верно

Комментарии:

1. Не могли бы вы, пожалуйста, показать нам свой код?

2. @Marco я думаю, что мне нужно будет использовать левое соединение, поэтому я придумал просто — из t1 в таблице 1 присоединиться к t2 в таблице 2 на t1. Идентификатор равен t2.ID в temp из leftjoinvar в temp. Пустота по умолчанию()

3. Пожалуйста, добавьте его в свой вопрос, используя кнопку редактирования, и подробно объясните, почему он не работает и как будет выглядеть ваш конечный результат.

4. @Marco Я обновил вопрос с кодом. Пожалуйста, проверьте. Также у меня нет направления для требуемого запроса. Это основная необходимая логика.

Ответ №1:

Я думаю, что приведенный ниже код может вам помочь. Если вы раскомментируете строки в общем списке t2 , он вернется true , в противном случае он вернется false . Код соединяет две таблицы и выбирает количество null строк с значениями table2 . Вы также можете сослаться на это сообщение в блоге (Левое соединение в Linq с примерами).

     class Table1
    {
        public int Id { get; set; }
    }

    class Table2
    {
        public int Id2 { get; set; }
        public int Id { get; set; }
    }

    [TestMethod()]
    public void LeftJoinTest()
    {
        List<Table1> t1 = new List<Table1> {
            new Table1{ Id = 5 },
            new Table1{ Id = 6 },
        };

        List<Table2> t2 = new List<Table2> {
            new Table2{ Id2 = 1, Id = 5 },
            new Table2{ Id2 = 2, Id = 5 },
            new Table2{ Id2 = 3, Id = 5 },
            new Table2{ Id2 = 4, Id = 5 },
            new Table2{ Id2 = 5, Id = 5 },
            //new Table2{ Id2 = 6, Id = 6 },
            //new Table2{ Id2 = 7, Id = 6 },
        };

        var result = t1
            .GroupJoin(t2, id => id.Id, id2 => id2.Id, (id, id2) => new { id.Id, id2 })
            .SelectMany(x => x.id2.DefaultIfEmpty(), (id1, id2) => new { id1, id2 })
            .Count(x => x.id2 == null) == 0;
    }
 

Комментарии:

1. Я обновил свой вопрос с помощью некоторого кода. Не могли бы вы, пожалуйста, взглянуть? Тем временем я обдумываю ваше предложение.

Ответ №2:

Я работал в направлении того, что предложил @Alisettar Гусейнли. Сначала я подсчитал, какое предполагаемое количество записей должно быть в таблице. Затем я подсчитал записи, фактически присутствующие в таблице. Если фактические записи меньше, чем предполагаемые, то верните значение false. У меня есть более крупный запрос, и этот вопрос является только частью, поэтому я не добавляю код.