2008-11-14 86 views
0

如何走到这一步的工作LINQ帮助 - 新手

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; 
} 

但这并不

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; 
    } 

回答

3

问题中的应用很可能在查询提供者的实现中。

pcm.PostId == 1

pcm.PostId ==帖子ID

实际上有很大的区别。在表达式树中,第一个被生成为ConstantExpression,不需要被忽略。

第二,编译器实际上在这里生成一个内部类(这是您看到的_DisplayClassX)。该类将拥有一个属性(很可能与您的参数名称相同),表达式树将创建一个指向自动生成的DisplayClassX的MemberAccessExpression。当您查询提供者时,您需要编译()Lambda表达式并评估委托以获取要在查询中使用的值。

希望这会有所帮助。

cosullivan

0

的问题不是你需要确保上下文或提供者对象是LINQ本身, 能够获取数据。 尝试测试

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

对象,看他们是否被填充,或者根据需要,他们表现。

您可能想要搜索c__DisplayClass1的生成代码并查看您可以在那里看到的内容。有时候生成的代码会导致一些奇怪的事情。

当你进入你的代码检查当地人和变量值。这也可能会给你一些线索。

编辑:您是否尝试过返回列表<>集合?或Enumerable类型?

编辑:什么是真正的类型项目和查询可能不会迭代

+0

给出了同样的错误 – Nesizer 2008-11-14 12:59:14

0

mnour这是测试它

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; 
    } 
} 

}