#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>
Для приведенного выше примера необходим результат
- F1 — верно
- 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. У меня есть более крупный запрос, и этот вопрос является только частью, поэтому я не добавляю код.