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
La création d'une vue SQL n'est-elle pas une option? –
Créer une vue défie l'objectif du trou d'utiliser un ORM OMI. – gautema
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. –