2008-11-14 5 views
0

comment se fait ce travailLINQ aide - débutant

public IQueryable<Category> getCategories(int postId) 
{ 
     subnusMVCRepository<Categories> categories = new subnusMVCRepository<Categories>(); 
     subnusMVCRepository<Post_Category_Map> postCategoryMap = new subnusMVCRepository<Post_Category_Map>(); 

     var query = from c in categories.GetAll() 
        join pcm in postCategoryMap.GetAll() on c.CategoryId equals pcm.CategoryId 
        where pcm.PostId == 1 
        select new Category 
        { 
        Name = c.Name, 
        CategoryId = c.CategoryId 
        }; 
     return query; 
} 

mais cela ne

public IQueryable<Category> getCategories(int postId) 
{ 
subnusMVCRepository<Categories> categories = new subnusMVCRepository<Categories>(); 
subnusMVCRepository<Post_Category_Map> postCategoryMap = new subnusMVCRepository<Post_Category_Map>(); 

    var query = from c in categories.GetAll() 
       join pcm in postCategoryMap.GetAll() on c.CategoryId equals pcm.CategoryId 
       where pcm.PostId == postId 
       select new Category 
       { 
        Name = c.Name, 
        CategoryId = c.CategoryId 
       }; 
    return query; 
    } 

Répondre

3

La question est le plus probable dans l'implémentation du fournisseur de requête.

pcm.PostId == 1

et

pcm.PostId == postId

ont fait une grande différence. Dans l'arbre d'expression, le premier est généré comme une expression constante qui n'a pas besoin d'être évaluée. Avec la seconde, le compilateur génère en fait une classe interne ici (c'est le _DisplayClassX que vous voyez). Cette classe aura une propriété (sera probablement le même nom que votre paramètre) et l'arbre d'expression créera une MemberAccessExpression qui pointe vers le DisplayClassX généré automatiquement. Lorsque vous interrogez le fournisseur, vous devez compiler() l'expression Lambda et évaluer le délégué pour obtenir la valeur à utiliser dans votre requête.

Espérons que cela aide.

cosullivan

0

Le problème n'est pas le LINQ lui-même, vous devez être sûr que l'objet de contexte ou fournisseur est capable d'aller chercher les données. essayer de tester les

subnusMVCRepository<Categories> categories = new subnusMVCRepository<Categories>(); 
subnusMVCRepository<Post_Category_Map> postCategoryMap = new subnusMVCRepository<Post_Category_Map>(); 

objets et voir si elles sont peuplées ou si elles se comporter selon les besoins. Vous voudrez peut-être chercher le code généré pour c__DisplayClass1 et voir ce que vous pouvez voir là-bas. Parfois, le code généré dose des choses étranges.

Lorsque vous entrez dans votre code, vérifiez les locals et les valeurs des variables. Cela peut aussi vous donner quelques indices.

Modifier: Avez-vous essayé de retourner une liste <> collection? ou un type Enumerable?

Edit: Quel est le type réel de l'élément et requête peut ne pas être itérable

+0

donne la même erreur – Nesizer

+0

j'ai télécharger une console exemple d'application qui s'écrasent http://www.subnus.net/ConsoleApplication3.zip – Nesizer

0

mnour c'est l'application pour le tester

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using subnusMVC; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 

     var query = getCategories(1); 

     foreach (var item in query) <-- error happens here 
     { 
      Console.WriteLine(item.Name); 
     } 
     Console.ReadLine(); 
    } 
    public static IQueryable<Category> getCategories(int Id) 
    { 
     int postId = Id; 
     subnusMVCRepository<Categories> categories = new subnusMVCRepository<Categories>(); 
     subnusMVCRepository<Post_Category_Map> postCategoryMap = new subnusMVCRepository<Post_Category_Map>(); 

     var query = from c in categories.GetAll() 
        join pcm in postCategoryMap.GetAll()on c.CategoryId equals (pcm.CategoryId) 
        where pcm.PostId == postId 
        select new Category 
        { 
         Name = c.Name, 
         CategoryId = c.CategoryId 
        }; 
     return query; 
    } 
} 

}