2016-10-21 1 views
1

Dans mon application ASP.NET Web Forms, j'utilise (Model Binding/Entity Framework).Comment utiliser la requête Group By dans la liaison de modèle

Je veux afficher le résultat de ma requête Linq (grouper par) dans un Gridview, mais je ne peux pas !!

<asp:GridView runat="server" ID="UsersGrid" 
     ItemType="myApp.Models.users" DataKeyNames="id" 
     SelectMethod="UsersGrid_GetData" 
     AutoGenerateColumns="false"> 
    <Columns> 
     <asp:DynamicField DataField="Fonction" /> 
     <asp:DynamicField DataField="Count" /> 
    </Columns> 
</asp:GridView> 

code Derrière:

public IQueryable<users> UsersGrid_GetData() 
{ 
    ModelData db = new ModelData(); 

    var result = from d in db.users 
       group d by d.Fonction into grouped 
       select new 
       { 
        Fonction = grouped.Key, 
        Count = grouped.Count() 
       }; 

    return result.AsQueryable();   
} 

J'ai cette erreur:

Impossible de convertir implicitement le type 'System.Linq.IQueryable <>' à 'System.Linq.IQueryable' . Une conversion explicite existe (vous manque un casting?)

Répondre

1

Vous créez objet de type anonyme et d'essayer de le convertir en Queryable. C'est pourquoi vous obtenez cette erreur.

Essayez ceci: Méthode 1: Si vous souhaitez utiliser le modèle d'utilisateur lui-même où «utilisateurs» ont les propriétés que vous avez besoin de lier à la vue de la grille.

public IQueryable<users> UsersGrid_GetData() 
    { 
     ModelData db = new ModelData(); 

     var result = from d in db.users 
       group d by d.Fonction into grouped 
        select new users 
        { 
         Fonction = grouped.Key, 
         Count = grouped.Count() 
        }; 

     return result; 

    } 

Méthode 2: Utiliser un modèle différent 'p'

public IQueryable<p> UsersGrid_GetData() 
    { 
     ModelData db = new ModelData(); 

     var result = from d in db.users 
       group d by d.Fonction into grouped 
        select new p 
        { 
         Fonction = grouped.Key, 
         Count = grouped.Count() 
        }; 

     return result; 

    } 

    public class p 
    { 
     public int? Fonction { get; set; } 
     public int Count { get; set; } 
    } 

Au lieu de 'p' donner un nom valide selon votre application. Apportez également les modifications nécessaires dans la vue de la grille (Vous devrez peut-être modifier "ItemType =" myApp.Models.users ").

+0

Merci beaucoup. – ista9im

1

Le résultat est pas un IQueryable de votre Model, il est un IQueryable de Anonymous Type. Donc, il devrait être comme ça (créer une nouvelle DTO classe et le retourner à la place):

public IQueryable<DTO> UsersGrid_GetData() 
{ 
    ModelData db = new ModelData(); 
    var result = from d in db.users 
       group d by d.Fonction into grouped 
       select new DTO 
       { 
        Fonction = grouped.Key, 
        Count = grouped.Count() 
       }; 
    return result.AsQueryable(); 
} 

public class DTO 
{ 
    public string Fonction { get; set; } 
    public int Count { get; set; } 
} 
+0

Merci beaucoup – ista9im