powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Получить значения отсутствующие в огромной таблице через EF-Linq
8 сообщений из 8, страница 1 из 1
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40100778
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Есть ли возможность в EF Core 5 через Linq сформировать похожий по смыслу запрос (MSSQL).

Код: sql
1.
2.
3.
4.
5.
6.
SELECT
  tmp.a
FROM
  (VALUES ('A'),('B'),('C')) AS tmp(A)
EXCEPT
SELECT g.Code FROM Gtin AS g



Где A, B - это список значений.

Суть:
Есть массив строк, надо узнать каких значений нет в таблице. Таблица и список могут быть сколь угодно большими. Поэтому вариант вычитать то что есть, и потом сделать Except не вариант.

Примерно так надо сделать, и получить запрос выше:
Код: c#
1.
2.
var gtins = new List<String> { "A", "B", "C" };
var gtinsNotExists = gtins.Except(_db.Gtins.Select(p => p.Code)).ToList();


Но этот запрос генерирует
Код: sql
1.
SELECT [g].[code] FROM [Gtin] AS [g]


т.е. вычитывает всю таблицу и только потом делает Except.

Один из вариантов, это что-то вроде этого.
Код: c#
1.
2.
3.
4.
5.
6.
var gtins = new List<String> { "A", "B", "C" }.AsEnumerable();
gtins = gtins.Select(p => "('" + p + "')");
var s = String.Join(',', gtins);
var x = await _db.Gtins
     .FromSqlRaw($"SELECT tmp.Code FROM (VALUES {s}) AS tmp(Code) EXCEPT SELECT g.Code FROM Gtin AS g")
     .Select(c => c.Code).ToListAsync();
...
Рейтинг: 0 / 0
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40100843
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Код: c#
1.
2.
3.
var gtins = new[] { "A", "B", "C" };

_db.Gtins.Where(p => !gtins.Contains(p.Code));



перестаньте уже везде тулить new List<...>, есть же массивы.
...
Рейтинг: 0 / 0
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40100845
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Не то. Этот вернет те записи из таблицы которых нет в списке.
А надо вернуть те записи их списка, которых нет в таблице.
...
Рейтинг: 0 / 0
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40101463
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Да тож самое почти, заберите значения, которые найдены, потом исключите их из своего набора.

Код: c#
1.
2.
3.
4.
5.
var gtins = new[] { "A", "B", "C" };

var exists = _db.Gtins.Select(p => p.Code).Where(p => gtins.Contains(p)).Distinct();

var result = gtins.Except(exists);
...
Рейтинг: 0 / 0
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40101524
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Так а если в таблице 1/10/100 млн записей, и в списке 1 млн.. Зачем возвращать потенциально 9/99 млн

Суть именно в том, чтобы SQL-сервер это сделал. По сути сгенерировался запрос или его аналог
Код: sql
1.
SELECT tmp.Code FROM (VALUES ('A'),('B'),('C')) AS tmp(Code) EXCEPT SELECT g.Code FROM Gtin AS g



Но как я понял на данный момент, из коробки EF это не умеет. Кроме как использования FromSqlRaw.
...
Рейтинг: 0 / 0
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40101562
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

При чём тут "EF не умеет"? Он изначально не предназначен для задач типа сделать операцию на глаз через задницу. Претензии безосновательны :)

Пересмотрите свою задачу.
...
Рейтинг: 0 / 0
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40104149
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Получить значения отсутствующие в огромной таблице через EF-Linq
    #40104193
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, $800 и это и многие другие извращения будут доступны - пошукайте на zzzprojects.com , если самому заморачиваться лень
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Получить значения отсутствующие в огромной таблице через EF-Linq
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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