2016-11-10 2 views
2

J'essaie de travailler avec la bibliothèque Dynamic Linq pour interroger ma source de données d'infrastructure. J'ai ajouté le bon paquet à mon projet et ont utilisé la syntaxe suivanteImpossible de faire fonctionner Dynamic Linq

var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate) 
            .Where(c => c.CompanyID == companyID) 
            .Where("[email protected]",1) 
            .ToList(); 

J'ai aussi essayé

.Where("StoreID=1") 

basée sur l'exemple que je trouve sur le billet de blog ScottGu cette requête la plus dynamique SO des questions semblent suggérer. Quelqu'un peut-il m'aider à voir ce qui me manque pour faire ce travail?

Il ne produit pas et erreur, il ne renvoie tout simplement pas de données du tout.

+0

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

+0

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. –

+0

Pourriez-vous essayer '.Where (s => s.StoreID == 1)'? Est-ce qu'il renvoie des données? – uTeisT

Répondre

2

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"); 
+0

Merci, je n'ai jamais connu la fonctionnalité de .Contains cela a été d'une grande aide! – Nate58

+0

@NateGreene J'ai développé ma réponse. –

0

Idk si vous avez trié cela, mais je viens de remarquer votre réponse à mon commentaire.

Je pense que ce qui vous manque est = au lieu de == en comparant StoreID.

var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate) 
           .Where(c => c.CompanyID == companyID) 
           .Where("StoreID = @0",1) 
           .ToList();