Предложение where in в entity framework core

Я хочу преобразовать этот SQL-запрос в запрос Entity Framework Core 2.0.

SELECT * 
FROM Product
WHERE ProdID IN (1,2,3);

Столбец ProdID имеет тип bigint и работает только со строковыми столбцами.

Kumudini Porwal 31.08.2018 09:32

Вопрос о Entity Framework Core 2.0 в 2018 году не является дубликатом вопроса LINQ to Entities из 2009 года.

Mark Rendle 23.02.2019 14:55

@MarkRendle Полагаю, вы правы ... однако техника все еще применяется. Базовая реализация IQueryable - это то, что различается между различными технологиями Linq-to-something ... делая использование (справедливо) согласованным во всех отношениях. Люди, незнакомые с историей Linq, могут этого не осознавать.

Clay 23.02.2019 18:43

@KumudiniPorwal, Contains в Linq - это универсальная функция, принимающая лямбда в качестве аргумента ... и может быть любого типа, определяемого самой лямбдой.

Clay 23.02.2019 18:46

@Clay, конечно, но связанный ответ - это не то, что вы бы сделали с помощью Marten, NHibernate или RavenDB. Нам не следует связывать EF Core с EF или Linq2Sql.

Phill 24.02.2019 08:18

@Clay Как вы сказали, код генерации SQL для LINQ-to-Entities полностью отличается от кода EF Core, поэтому нет причин предполагать, что решение такое же. С точки зрения возможностей поиска было бы лучше иметь ответ на этот вопрос EF Core, чем флаг «Дублировать».

Mark Rendle 24.02.2019 20:50

Я проголосовал за повторное открытие, учитывая коллективную озабоченность. Однако смысл Linq в том, что использование должен быть идентичным для разных технологий ... и я предполагаю, что именно так чувствовал себя исходный дублирующий флаггер. Итак ... для ясности, я тоже помечу его как Linq ;-)

Clay 24.02.2019 23:00

Вы имеете в виду этот _context.Products.Where (p => products.Contains (p.ProdID))? или вы имеете в виду, как использовать Raw Sql?

Vova Bilyachat 24.02.2019 23:10
12
8
10 160
1

Ответы 1

Согласно комментариям к вопросу, способ, которым вы делаете это в EF Core, такой же, как и для LINQ-to-SQL: используйте метод расширения Enumerable.Contains для массива в вашем выражении Where.

public async Task<List<Product>> GetProducts(params int[] ids)
{
    return await context.Products
        .Where(p => ids.Contains(p.ProdID)) // Enumerable.Contains extension method
        .ToListAsync();
}

См. Соответствующий вопрос LINQ to Entities

Другие вопросы по теме