[Linq.Expression] Pourquoi ma surcharge 'Expression.And' lève une Exception ?
Bonjour,
J'ai cette méthode qui utilise une lambda avec juste un Expression.Equal, et qui marche très bien:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public T GetByID(Guid a_id)
{
var itemParameter = Expression.Parameter(typeof(T), "item");
var whereExpression = Expression.Lambda<Func<T, bool>>
(
Expression.Equal(
Expression.Property(
itemParameter,
PrimaryKeyName
),
Expression.Constant(a_id)
),
new ParameterExpression[] { itemParameter }
);
return _context.GetTable<T>().Where(whereExpression).Single();
} |
mon souci c'est que j'ai besoin de surcharger cette méthode pour que l'expression lambda soit une 'Expression.And' au lieu d'une simple Expression.Equal.
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
public T GetByIDs(Guid[] a_ids)
{
var itemParameter1 = Expression.Parameter(typeof(T), "item");
var itemParameter2 = Expression.Parameter(typeof(T), "item2");
var equals1 = Expression.Equal(
Expression.Property(
itemParameter1,
PrimaryKeyNames[0]
),
Expression.Constant(a_ids[0])
);
var equals2 = Expression.Equal(
Expression.Property(
itemParameter2,
PrimaryKeyNames[1]
),
Expression.Constant(a_ids[1])
);
var andexpression = Expression.And(equals1, equals2);
var parameters = new ParameterExpression[] { itemParameter1, itemParameter2 };
var whereExpression = Expression.Lambda<Func<T, bool>> //BUG ICI
(andexpression, parameters);
return _context.GetTable<T>().Where(whereExpression).Single();
} |
j'ai une erreur à l'appel du constructeur Expression.Lambda<Func<T, bool>> :
"Incorrect number of parameters supplied for lambda declaration".
La création des deux expressions "equals" (equals1 ,equals2) ainsi que "add"(andexpression ) se passent bien, et on l'air de contenir les données qu'il faut quand je les regarde en debug.
l'erreur que j'ai est la suivante:
"Incorrect number of parameters supplied for lambda declaration"
Le truc c'est que c'est la seule erreur que .NET retourne dans le cas d'une erreur sur la création d'une lambda(il me semble), donc on ne peut pas se baser sur l'intitulé :(
Quelqu'un à une idée?