2010-02-24 6 views
0

D'abord, j'utilise C# 4.0 et EF 4.0 avec l'objet POCO pour accéder à la base de données. Ensuite, je crée une grille (comme jqGrid) pour afficher les données de la base de données via ASP.NET MVC 2.0. Cette grille peut commander des données en cliquant sur l'en-tête de la colonne. Le code source pourrait ressembler à ceci.Comment utiliser un argument dans NewExpression comme expression à utiliser dans la méthode OrderBy?

// This method will generate data for jqGrid request. 
// jqGridRequest contain several options about how to query data like 
// Take 10 result 
// Skip 50 rows 
// Filter by something 
// Order by column name 
public JsonResult GetPeopleData(jqGridRequest req) 
{ 
    // This extension method has 2 parameters that are jqGridRequest and 
    // Expression<Func<T, object>> for creating object to be serialized. 
    // In this case, T is People type.  
    return DataContext.People.AsJqGridResult 
    (
     req, 
     x => new 
     { 
      x.ID, 
      Name = x.FirstName + " " + x.LastName, 
      x.Age 
     } 
    ) 
} 

Tout fonctionne bien. La question est quand j'essaye de commander la colonne de «nom» dans cette grille, jqGrid enverra la demande que le contrôleur indique aux données de commande par la colonne de «nom». Cependant, la colonne "Nom" n'existe pas dans la base de données, car il s'agit simplement d'une valeur combinée d'une colonne.

Le plus simple pour résoudre cette question est de créer du code pour faire quelque chose comme le code suivant. Cependant, j'ai besoin de créer une méthode pour gérer n'importe quelle condition simple de commande comme celle-ci. Après avoir cherché et essayé toutes les possibilités d'expression. Je viens de trouver que je peux utiliser certaines données contenues dans NewExpression pour commander cette requête. Mais je ne sais pas comment convertir/créer Argument dans l'objet NewExpression à Expression pour utiliser comme paramètre de méthode OrderBy.

Merci

+0

La création d'une vue SQL n'est-elle pas une option? –

+0

Créer une vue défie l'objectif du trou d'utiliser un ORM OMI. – gautema

+0

Je pense que créer une vue SQL n'a pas de sens pour cette question. De plus, je ne peux pas directement créer un objet à partir d'une classe basée sur POCO car elle a toujours une erreur de référence circulaire dans la classe proxy POCO lorsque je la sérialise. –

Répondre

0

Name n'existe pas sur la base de données, mais il ne existe dans le type anonyme que vous projetez sur. Je ne vais pas essayer de deviner ce que font toutes vos méthodes d'extension. Mais si vous avez fait:

var q = from p in DataContext.People 
     select new 
     { 
      Name = p.FirstName + " " + p.LastName 
     }; 

... puis:

var r = q.OrderBy(p => p.Name); 

... alors il devrait "juste".

+0

Je sais qu'il peut écrire quelque chose comme ça. Mais ce n'est pas ce que je veux pour cette question. J'ai besoin d'une méthode pour convertir l'expression binaire (comme x.col1 + '' + x.col2) en expression qui peut être utilisée dans la méthode OrderBy. Cependant, si tout le monde ne peut pas résoudre cette question, j'utiliserai quelque chose comme votre suggestion pour résoudre cette question. –

+0

Vous pouvez écrire 'Expression > nameExp = p => p.PrénomName +" "+ p.NomNom" Vous pouvez alors faire '.OrderBy (nameExp)' et convertir en SQL. Mais remarquez que j'utilise 'Person' ici; cela ne fonctionnera pas avec un type anonyme. –

Questions connexes