Comment créer une méthode d'extension de jointure LINQ dynamique
Il y avait une bibliothèque de dynamique LINQ extensions de méthodes publié comme un exemple avec Visual Studio; 2008. J'aimerais de l'étendre avec une méthode de participation. Le code ci-dessous échoue avec un paramètre miss match d'exception au moment de l'exécution. Où est le problème?
public static IQueryable Join(this IQueryable outer, IEnumerable inner,
string outerSelector, string innerSelector, string resultsSelector,
params object[] values)
{
if (inner == null)
throw new ArgumentNullException("inner");
if (outerSelector == null)
throw new ArgumentNullException("outerSelector");
if (innerSelector == null)
throw new ArgumentNullException("innerSelector");
if (resultsSelector == null)
throw new ArgumentNullException("resultsSelctor");
LambdaExpression outerSelectorLambda =
DynamicExpression.ParseLambda(outer.ElementType, null,
outerSelector, values);
LambdaExpression innerSelectorLambda =
DynamicExpression.ParseLambda(inner.AsQueryable().ElementType,
null, innerSelector, values);
ParameterExpression[] parameters = new ParameterExpression[] {
Expression.Parameter(outer.ElementType, "outer"),
Expression.Parameter(inner.AsQueryable().ElementType,
"inner")
};
LambdaExpression resultsSelectorLambda =
DynamicExpression.ParseLambda(parameters, null,
resultsSelector, values);
return outer.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Join", new Type[] {
outer.ElementType,
inner.AsQueryable().ElementType,
outerSelectorLambda.Body.Type,
innerSelectorLambda.Body.Type,
resultsSelectorLambda.Body.Type
},
outer.Expression, inner.AsQueryable().Expression,
Expression.Quote(outerSelectorLambda),
Expression.Quote(innerSelectorLambda),
Expression.Quote(resultsSelectorLambda))
);
}
source d'informationauteur Royd Brayshay
Vous devez vous connecter pour publier un commentaire.
J'ai fixé moi-même maintenant. C'était un écolier d'erreur en passant trop de paramètres à la CreateQuery (... ). Collez le code suivant dans la Dynamique.cs fichier dans le DynamicQueryable classe pour une dynamique de Rejoindre méthode d'extension. Vous pouvez trouver la source de la DynamicQuery exemple de projet à http://code.msdn.microsoft.com/csharpsamples.
Profiter.
Vous pouvez installer le package nuget de Système.Linq.Dynamique.Core - https://github.com/StefH/System.Linq.Dynamic.Core
Ce a la jointure de la méthode mise en œuvre, de concert avec divers autres méthodes d'assistance.
L'utilisation de cette bibliothèque, vous pouvez faire une simple jointure dans la suite de la façon
myContext.TableA.Join(myContext.TableB,'Id','TableAId','outer',null)
dans le résultat sélecteur de
outer
etinner
sont les mots clés pour accéder au résultat de la jointure.L'aide d'une clé avec de multiples propriétés et/ou la sélection d'un résultat avec de multiples propriétés peut être fait de la manière suivante
myContext.TableA.Join(myContext.TableB,'new (Id as key1,Code as key2)','new (TableAId as key1,AnotherCol as key2)','new(outer.Id,inner.Desc)',null)
Voici un exemple de code montrant une jointure sur plusieurs colonnes. À l'aide d'un datatable et des datarow vous devez toujours l'accès des champs via l'indexeur.