Expression Lambda à utiliser dans la requête Select ()

c# expression-trees lambda

Question

J'essaie de créer une expression lambda, contenant deux assignations (comme indiqué plus bas), que je peux ensuite transmettre à une méthode Queryable.Select ().

J'essaie de passer une variable de chaîne dans une méthode, puis de l'utiliser pour construire l'expression lambda afin de pouvoir l'utiliser dans une requête LINQ Select.

Mon raisonnement derrière cela est que j'ai une source de données SQL Server avec plusieurs noms de colonne, je crée une application de graphique qui permettra à l'utilisateur de sélectionner, en tapant dans le nom de la colonne, la colonne de données à afficher dans la liste. axe des y de mon graphique, l’axe des x étant toujours DateTime. Par conséquent, ils peuvent essentiellement choisir les données qu’ils cartographient par rapport à la valeur DateTime (c’est une application de type entrepôt de données).

J'ai, par exemple, une classe pour stocker les données récupérées, et donc utiliser comme source de graphique de:

public class AnalysisChartSource
{
    public DateTime Invoicedate { get; set; }
    public Decimal yValue { get; set; }
}

J'ai (à titre expérimental) construit un arbre d'expression pour la clause Where en utilisant la valeur String et cela fonctionne bien:

public class AnalysisChartSource
{
    public DateTime Invoicedate { get; set; }
    public Decimal yValue { get; set; }
}

Cependant ... J'ai essayé une approche similaire pour l'instruction Select, mais je ne peux tout simplement pas le faire fonctionner car j'ai besoin de Select () pour renseigner les valeurs X et Y de la classe AnalysisChartSource, comme ceci:

public class AnalysisChartSource
{
    public DateTime Invoicedate { get; set; }
    public Decimal yValue { get; set; }
}

Comment diable puis-je construire un tel arbre d'expression… ou… peut-être plus précisément… est-il un moyen plus facile que j'ai complètement manqué?

Réponse acceptée

Je trouve que la meilleure façon de construire des arbres d’expression est de voir ce que fait le compilateur C #. Alors voici un programme complet:

using System;
using System.Linq.Expressions;

public class Foo
{
    public int X { get; set; }
    public int Y { get; set; }
}

class Test
{
    static void Main()
    {
        Expression<Func<int, Foo>> builder = 
            z => new Foo { X = z, Y = z };
    }
}

Compilez-le, ouvrez les résultats dans Reflector et définissez l'optimisation sur .NET 2.0. Vous vous retrouvez avec ce code généré pour la méthode Main:

using System;
using System.Linq.Expressions;

public class Foo
{
    public int X { get; set; }
    public int Y { get; set; }
}

class Test
{
    static void Main()
    {
        Expression<Func<int, Foo>> builder = 
            z => new Foo { X = z, Y = z };
    }
}

Fondamentalement, je pense que Expression.MemberInit est ce que vous recherchez.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi