c# - кэширование - entity framework пример




Добавление динамического предложения where в Entity Framework (4)

У меня есть это заявление sql

SELECT userID from users WHERE
(name='name1' AND username='username1') OR
(name='name2' AND username='username2') OR
(name='name3' AND username='username3') OR
..........
(name='nameN' AND username='usernameN')

Hho могу ли я реализовать этот оператор с каркасом сущности с помощью LINQ?


Вы можете использовать красивую вещь под названием PredicateBuilder . Используйте его так

var pr = PredicateBuilder.False<User>();
foreach (var name in names)
{
    pr = pr.Or(x => x.Name == name && x.Username == name);
}
return query.AsExpandable().Where(pr);

Не забывайте, что инфраструктура entity также понимает сущность sql , поэтому вы можете выполнить эту часть запроса в строке. Создание строки очень удобно, когда у вас есть динамический материал, который вам нужно сделать.


Я должен был построить предикат для предложения «Where» динамически на основе выбора пользовательского интерфейса. 'System.Dynamic.Linq' позволяет предикаты из строк.

foreach (var name in names)
{
    query = query.Where("[email protected] And [email protected]", name, name);
}
return query;

«System.Dynamic.Linq» доступен как пакет nuget. Ознакомьтесь с введением Скотта Гатри в эту тему.


Я попробовал решение @Egor Pavlikhin, но я получил "The LINQ expression node type 'Invoke' is not supported in LINQ to Entities." ,

В соответствии с this вы можете использовать PredicateExtensions :

var predicate = PredicateExtensions.Begin<User>();
foreach (var name in names)
{
    pr = pr.Or(x => x.Name == name);
}
return _context.Users.Where(predicate);






entity-framework-4