TL; DR
Êtes-vous sûr que vous avez besoin LINQ dynamique pour cela?
List<int> storeIDs = new List<int>() {1,2,3};
var salesEntities = dashboardEntity.FactSales
.Where(d => d.DateKey >= startDate)
.Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where(c => storeIDs.Contains(c.StoreID))
.ToList();
Version longue
LINQ permet des expressions générées par le compilateur:
IQueryable<FactSales> qry;
qry = qry.Where(x => x.DateKey >= startDate);
Si les expressions doivent changer lors de l'exécution, il est possible de construire l'expression à l'aide méthodes statiques dans le System.Linq.Expressions.Expression
class:
//using static System.Linq.Expressions.Expression;
//x
var parameter = Parameter(typeof(FactSale));
//x.DateKey
var dateKey = MakeMemberAccess(parameter, typeof(FactSales).GetProperty("DateKey"));
//(the value in startDate, as if it had been written in)
var startDateConst = Constant(startDate);
//x.DateKey >= (value of startDate)
var comparison = GreaterThanOrEqual(dateKey, startDateConst);
//x => x.DateKey >= (value of startDate)
var lmbd = Lambda<Func<FactSale,bool>>(comparison, new [] {prm});
//pass the expression into the Queryable.Where method
qry = qry.Where(lmbd);
La bibliothèque dynamique LINQ (dont la dernière incarnation se trouve here) permet de générer des expressions utilisant des chaînes:
IQueryable<FactSales> qry;
qry = qry.Where("DateKey >= @0", startDate);
dynamique LINQ est extrêmement utile lorsque l'expression est inconnue au moment de la compilation, mais dans ce cas , l'expression est connue au moment de la compilation (dans ce cas, en utilisant le List<T>.Contains
method. Par conséquent, je ne vois aucune raison d'utiliser Dynamic LINQ ici.
N.B. Je ne sais toujours pas pourquoi cela ne fonctionne pas:
var qry = dashboardEntity.FactSales.Where("StoreID = 1");
Je viens de créer un échantillon de test simple, la raison pour laquelle je dois utiliser Dynamic Linq est parce que les utilisateurs doivent être en mesure de choisir 1 ou plusieurs magasins à Voir dynamiquement à l'exécution, c'est pourquoi le .Where() pour StoreID est séparé des autres – Nate58
La dernière fois que j'ai vérifié linq, il ne supporte pas ce genre de syntaxe. Vous devrez peut-être créer vos propres prédicats ... Les prédicats sont essentiellement utilisés pour créer des requêtes dynamiques ... pensez comme une recherche multi-filtres comme scénario possible. Voici un bon exemple: http: //www.c-sharpcorner.com/UploadFile/c42694/dynamic-query-in-linq-using-predicate-builder/... C# 6.0 a déjà un 'PredicateBuilder' que vous peut vouloir vérifier. –
Pourriez-vous essayer '.Where (s => s.StoreID == 1)'? Est-ce qu'il renvoie des données? – uTeisT