J'ai une requête comme celle-ci
(from u in DataContext.Users
where u.Division == strUserDiv
&& u.Age > 18
&& u.Height > strHeightinFeet
select new DTO_UserMaster
{
Prop1 = u.Name,
}).ToList();
Je souhaite ajouter les différentes conditions telles que l'âge, la hauteur en fonction de si ces conditions ont été fournies à la méthode exécutant cette requête. Toutes les conditions incluront la division utilisateur. Si l'âge a été fourni, je veux l'ajouter à la requête. De même, si la hauteur a été fournie, je veux également l'ajouter.
Si cela devait être fait à l'aide de requêtes SQL, j'aurais utilisé le générateur de chaînes pour les ajouter à la requête strSQL principale. Mais ici, dans Linq, je ne peux penser qu'à utiliser une condition IF où j'écrirai la même requête trois fois, chaque bloc IF ayant une condition supplémentaire. Y a-t-il une meilleure manière de faire cela?
la source
LINQ to Entities does not recognize the method 'System.String get_Item(System.String)' method, and this method cannot be translated into a store expression.
J'utilise généralement le chaînage de méthodes mais j'ai le même problème. Et voici l'extension que j'utilise
Cela permet d'éviter les ruptures de chaîne. Aussi les mêmes
ConditionalOrderBy
etConditionalOrderByDescending
sont utiles.la source
une option.
ou vous pouvez passer à la syntaxe de méthode pour linq et utiliser des conditions if pour attacher des expressions à la clause where.
la source
Simplement, je l'utilise dans ma clause where comme
la source
En fonction de certaines conditions, ajoutez la condition where ...
la source
Voici mon code pour faire une chose similaire. Il s'agit d'une méthode sur mon API de service Web SOAP WCF.
La requête de base est
Select(f => f)
ce qui signifie fondamentalement TOUT, et lesWhere
clauses y sont éventuellement attachées. La finaleSelect
est facultative. J'utilise pour convertir les objets de lignes de base de données en objets de résultat "Fruit".la source
En supposant le paramètre suivant,
En utilisant simplement
&&
et des||
opérateurs conditionnels, nous pouvons avoir une autre version.Comme Param1, vous pouvez ajouter n'importe quel nombre de paramètres pour la condition de recherche.
la source
Je viens de tomber sur cela à la recherche de quelque chose d'autre, mais j'ai pensé que je jetterais dans la version lambda.
Tout d'abord, je créerais une classe comme celle-ci pour passer des paramètres dans une couche de données:
Ensuite, dans ma couche de données, quelque chose comme ceci:
L'endroit où vous matérialisez la requête dépend de vous. Il peut y avoir une couche entre l'application et les données qui convertit les représentations spécifiques à la base de données en représentations indépendantes de la base de données (peut-être que vous interrogez plusieurs sources de données). Cette couche peut obtenir plusieurs types d'éléments interrogeables à partir de ces sources et les mapper à une représentation POCO commune, par exemple.
la source
Juste pour ajouter à la réponse acceptée ci-dessus ici , si vous effectuez une recherche dynamique sur une jointure, envisagez de renvoyer un nouvel objet avec les deux tables (t1, t2) dans la requête linq initiale afin que vous puissiez y accéder individuellement pour faire le conditionnel chercher.
J'ai eu la réponse que je cherchais ici en ce qui concerne la jonction de deux tables et l'interrogation de colonnes spécifiques sur l'une ou l'autre des tables
la source