J'ai une requête requête utilisant linq. La requête a une clause where multiple renvoyant la liste des éléments correspondant au nom et à la ville. Ci-dessous est le morceau de code que j'ai utilisé pour la clause where multiple, mais il renvoie un ensemble vide d'éléments. wherefield contient la liste des noms de champs comme le nom, la ville wherefieldValue contient la liste des valeurs de champ comme James, delhiClé dynamique multiple where dans linq C#
var where = FilterLinq<T>.GetWherePredicate(wherefield, wherefieldvalue).Compile();
items = items.Where(where).OrderByDescending(a => a.GetType().GetProperty(field).GetValue(a, null)).Skip
public class FilterLinq<T>
{
public static Expression<Func<T, Boolean>> GetWherePredicate(string whereFieldList, string whereFieldValues)
{
//the 'IN' parameter for expression ie T=> condition
ParameterExpression pe = Expression.Parameter(typeof(T), typeof(T).Name);
//combine them with and 1=1 Like no expression
Expression combined = null;
if (whereFieldList != null)
{
string[] field = whereFieldList.Split(';');
string[] fieldValue = whereFieldValues.Split(';');
for (int i = 0; i < field.Count(); i++)
{
//Expression for accessing Fields name property
Expression columnNameProperty = Expression.Property(pe, field[i]);
//the name constant to match
Expression columnValue = Expression.Constant(fieldValue[i]);
//the first expression: PatientantLastName = ?
Expression e1 = Expression.Equal(columnNameProperty, columnValue);
if (combined == null)
{
combined = e1;
}
else
{
combined = Expression.And(combined, e1);
}
}
}
//create and return the predicate
return Expression.Lambda<Func<T, Boolean>>(combined, new ParameterExpression[] { pe });
}
}
Un peu plus de code que nécessaire à mon goût, mais aucun bogue évident dès que les champs sont 'string' type' (' Expression.And' devrait être 'Expression.AndAlso', mais cela ne devrait pas changer le résultat). Pouvez-vous poster un exemple qui reproduit le problème? –
La deuxième ligne de votre code semble être incomplète. C'est peut-être une question stupide mais êtes-vous sûr que la clause where filtre tous les éléments? Y at-il une chance que, à la place, le problème est lié à l'instruction 'Skip' à la fin de la ligne? – wkl
Merci à tous pour les détails. J'ai un whereField qui est int et un autre une chaîne. Je vais essayer de convertir int en chaîne avant et vérifier – user166013