Question

Nous devons générer des requêtes LINQ qui sont 100% inconnues lors du codage (temps de conception). En effet, la logique est disponible dans notre framework, qui est séparé à 100% de tout projet de données. Pour les données, nous utilisons le code d'accès aux données généré par LLBLGen.

Normalement, en utilisant invokes sur la DLL, que nous spécifions au cadre (pas à la référence), nous pouvons créer du code pour récupérer des données. Mais maintenant, nous devons le faire par linq. Comment pourrions-nous créer une requête du type:

var q = from customer in m.Customer
        select new
        {                   
            customer.Number,
            customer.City,
            customer.CountryEntity.Name             
        };

à partir de chaînes uniquement. Nous aurions une chaîne appelée "client". Nous savons donc que nous devons récupérer du client. Ensuite, nous aurions une chaîne [] contenant les noms de champs que nous voulons récupérer. Comme vous pouvez le constater, ces colonnes pourraient inclure des types complexes (champs liés).

Tout conseil, en particulier en association avec LLBLGen, serait formidable!

Merci, Gab

Était-ce utile?

La solution

Je ne sais pas si c'est exactement ce que vous cherchez, mais Scott Gu a publié sur son blog un article sur l'utilisation de LINQ dynamique. http://weblogs.asp.net/scottgu/archive/2008/ 01/07 / dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Il ne fait peut-être pas tout ce dont vous avez besoin, mais vous risquez de vous en empêcher.

EDIT. Je venais de jeter un coup d'œil à un exemple de code fourni par Scott Gu, et j'ai constaté qu'il pouvait créer la partie choisie dont vous avez besoin. Exemple (code Scotts):

Dim query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). _
                OrderBy("CompanyName"). _
                Select("New(CompanyName as Name, Phone)")

Comme vous pouvez le constater, le bit du bas a une sélection dynamique.

Pour résoudre le problème de savoir dynamiquement quel objet interroger au moment de l'exécution, vous pouvez utiliser quelque chose comme ceci:

 Sub query(Of T)(ByVal Myobject As IQueryable(Of T))
    Dim i = Myobject.Select("New(customer.Number)")
 End Sub

Ensuite, vous pouvez juste changer un peu après avoir lu les noms de la base de données, comme suit:

Sub PassIt()
    Dim name = "customer"
    Select Case name
        Case "customer"
            query(m.Customer)
    End Select
End Sub

J'espère que ça aide. Remarque! Il y aurait une meilleure façon de faire la dernière partie (méthode passit) mais il est trop tôt pour y penser.

Désolé, la réponse est en VB, j'aurais dû le faire en C #

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top