Исходный код вики Запросы
Редактировал(а) Alexandr Fokin 2023/11/11 14:29
Последние авторы
author | version | line-number | content |
---|---|---|---|
1 | |(% style="width:285px" %) |(% style="width:1197px" %)Complex Query Operators | ||
2 | [[https:~~/~~/learn.microsoft.com/en-us/ef/core/querying/complex-query-operators>>https://learn.microsoft.com/en-us/ef/core/querying/complex-query-operators]] | ||
3 | |(% style="width:285px" %)Соединение таблиц с условием, с целью проверить, что во второй таблице нет записи из первой.|(% style="width:1197px" %)((( | ||
4 | |(% style="width:525px" %){{code language="C#"}}from t1 in <table1> | ||
5 | join t2 in <table2> | ||
6 | on new { Id = t1.Id, ConditionField = true } | ||
7 | equals new { Id = t2.ForeignId, ConditionField = t2.ConditionField } | ||
8 | into j | ||
9 | from r in j.DefaultIfEmpty() | ||
10 | where r == null | ||
11 | select t1.Id{{/code}}|(% style="width:239px" %){{code language="sql"}}SELECT t1.id | ||
12 | FROM | ||
13 | table1 AS t1 | ||
14 | LEFT JOIN table2 AS t2 | ||
15 | ON (t1.id = t2.foreign_id) | ||
16 | AND t2.condition_field | ||
17 | WHERE | ||
18 | (t2.id IS NULL){{/code}}|(% style="width:388px" %)Нет подзапросов и коррелированных запросов. Получен наиболее эффективный sql запрос. | ||
19 | |(% style="width:525px" %){{code language="c#"}}from t1 in <table1> | ||
20 | from t2 in <table2> | ||
21 | .Where(e => t1.Id == e.ForeignId && e.ConditionField == true) | ||
22 | .DefaultIfEmpty() | ||
23 | where t2 == null | ||
24 | select t1.Id{{/code}}|(% style="width:239px" %){{code language="sql"}}SELECT t1.id | ||
25 | FROM | ||
26 | table1 AS t1 | ||
27 | LEFT JOIN ( | ||
28 | SELECT | ||
29 | t2.id, | ||
30 | t2.foreign_id | ||
31 | FROM | ||
32 | table2 AS t2 | ||
33 | WHERE | ||
34 | t2.condition_field | ||
35 | ) AS t ON t1.id = t.foreign_id | ||
36 | WHERE | ||
37 | (t.id IS NULL){{/code}}|(% style="width:388px" %)Пока нет проверки t2.ConditionField, запрос корректный, но при добавлении проверки мы получаем подзапрос. | ||
38 | |(% style="width:525px" %){{code language="c#"}}<table1> | ||
39 | .Where( | ||
40 | e => !<table2> | ||
41 | .Where(e => e.ConditionField) | ||
42 | .Select(e => e.ForeignId) | ||
43 | .Contains(e.Id) | ||
44 | ){{/code}}|(% style="width:239px" %){{code language="sql"}}SELECT t1.id | ||
45 | FROM table1 AS t1 | ||
46 | WHERE | ||
47 | NOT ( | ||
48 | EXISTS ( | ||
49 | SELECT | ||
50 | 1 | ||
51 | FROM | ||
52 | table2 AS t2 | ||
53 | WHERE | ||
54 | t2.condition_field | ||
55 | AND (t2.foreign_id = t1.id) | ||
56 | ) | ||
57 | ){{/code}}|(% style="width:388px" %)Получаем коррелированный запрос. | ||
58 | |||
59 | |||
60 | ))) | ||
61 | |(% style="width:285px" %)Несколько соединений с условием|(% style="width:1197px" %)((( | ||
62 | |{{code language="c#"}}from t1 in <table1> | ||
63 | join t21 in <table2> | ||
64 | on new { Id = t1.Id, ConditionField = true } | ||
65 | equals new { Id = t21.ForeignId, ConditionField = t21.ConditionField } | ||
66 | into j1 | ||
67 | from r1 in j1.DefaultIfEmpty() | ||
68 | join t22 in <table2> | ||
69 | on new { Id = t1.Id, ConditionField = true } | ||
70 | equals new { Id = t22.ForeignId, ConditionField = t22.ConditionField } | ||
71 | into j2 | ||
72 | from r2 in j2.DefaultIfEmpty() | ||
73 | where r1 != null && r2 == null | ||
74 | select t1.Id{{/code}}|{{code language="sql"}}SELECT | ||
75 | t1.id | ||
76 | FROM | ||
77 | table1 AS t1 | ||
78 | LEFT JOIN table2 AS t21 ON (t1.id = t21.foreign_id) | ||
79 | AND t21.condition_field | ||
80 | LEFT JOIN table2 AS t22 ON (t1.id = t22.foreign_id) | ||
81 | AND NOT (t22.condition_field) | ||
82 | WHERE | ||
83 | (t21.id IS NOT NULL) | ||
84 | AND (t22.id IS NULL){{/code}} | ||
85 | ))) | ||
86 | |(% style="width:285px" %)Соединение DbSet и локальной коллекции.|(% style="width:1197px" %)[[Выборка данных на основе локальной коллекции>>doc:Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.Сценарии и проблемы.Выборка данных на основе локальной коллекции.WebHome]] |