powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - оптиальный аналог exists?
8 сообщений из 8, страница 1 из 1
LINQ - оптиальный аналог exists?
    #35217851
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем! Обычная задача отобрать скажем реестр документ ов у которых в детальной части товар с данным наименованием, что типа ищем документы продажи КАЛОШ
Код: plaintext
1.
2.
3.
select * from мойДокументы
where exists(select  1  from ДетальнаяЧастьДокументов
where ДетальнаяЧастьДокументов.Товар like '%КАЛОША'
) 
...
Рейтинг: 0 / 0
LINQ - оптиальный аналог exists?
    #35218072
можно типа
Код: plaintext
1.
2.
3.
var query
from c in db.GetTable<мойДокументы>()
where c.ДетальнаяЧастьДокументов.Count(dt=>dt.Товар.Contains('Калоша'))> 0 
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
LINQ - оптиальный аналог exists?
    #36476660
Spiridonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица, описывающая иерархические данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE [dbo].[Tasks](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[parent_id] [int] NULL,
	[name] [varchar](255) NOT NULL,
	[order] [int] NOT NULL CONSTRAINT [DF_Tasks_order]  DEFAULT ((0)),
	[norm_time] [real] NULL
)
parent_id ссылается на id

Как в Linq выполнить такой запрос:
select * from Tasks where not exists(select * from tasks t where tasks.id=t.parent_id) order by parent_id, [order], name
?

Помогите пожалуйста!
...
Рейтинг: 0 / 0
LINQ - оптиальный аналог exists?
    #36476662
Spiridonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т. е. необходимо выбрать только те записи, которые не имеют детей.
...
Рейтинг: 0 / 0
LINQ - оптиальный аналог exists?
    #36476724
Spiridonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой вариант не прокатывает:
Код: plaintext
1.
2.
3.
4.
from t in _datacontext.Tasks
                   where t.Tasks2.Count(dt => dt.Tasks1.parent_id == t.id) == 0
                   orderby t.parent_id, t.order, t.name
                   select t;
...
Рейтинг: 0 / 0
LINQ - оптиальный аналог exists?
    #36476760
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
var query = from t in context.Tasks
            where !(from t2 in context.Tasks
                    select t2.parent_id.Value)
                        .Contains(t.id)
            orderby t.parent_id, t.order, t.name
            select t;

SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT [t0].[id],
       [t0].[parent_id],
       [t0].[name],
       [t0].[order] AS [order],
       [t0].[norm_time]
FROM   [dbo].[Tasks] AS [t0]
WHERE  NOT (
           EXISTS(
               SELECT NULL AS [EMPTY]
               FROM   (
                          SELECT [t1].[parent_id] AS [value]
                          FROM   [dbo].[Tasks] AS [t1]
                      ) AS [t2]
               WHERE  [t2].[value] = [t0].[id]
           )
       )
ORDER BY
       [t0].[parent_id],
       [t0].[order],
       [t0].[name]
...
Рейтинг: 0 / 0
LINQ - оптиальный аналог exists?
    #36476771
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравним планы (см. аттач).

SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT *
FROM   Tasks
WHERE  NOT EXISTS(
           SELECT *
           FROM   Tasks t
           WHERE  Tasks.id = t.parent_id
       )
ORDER BY
       parent_id,
       [order],
       [name]

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT [t0].[id],
       [t0].[parent_id],
       [t0].[name],
       [t0].[order] AS [order],
       [t0].[norm_time]
FROM   [dbo].[Tasks] AS [t0]
WHERE  NOT (
           EXISTS(
               SELECT NULL AS [EMPTY]
               FROM   (
                          SELECT [t1].[parent_id] AS [value]
                          FROM   [dbo].[Tasks] AS [t1]
                      ) AS [t2]
               WHERE  [t2].[value] = [t0].[id]
           )
       )
ORDER BY
       [t0].[parent_id],
       [t0].[order],
       [t0].[name]


Планы выполнения одинаковые. Следовательно, оптимизатор всё делает так, как нам нужно.
...
Рейтинг: 0 / 0
LINQ - оптиальный аналог exists?
    #36477184
Spiridonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ,

Спасибо! Это то, что надо!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - оптиальный аналог exists?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]