linq帮助 - 新手

时间:2008-11-14 11:14:16

标签: linq c#-3.0 subsonic-v3p2

怎么来这个工作

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

2 个答案:

答案 0 :(得分:3)

问题很可能出在查询提供程序的实现中。

pcm.PostId == 1

pcm.PostId == postId

实际上有很大的不同。在表达式树中,第一个生成为ConstantExpression,不需要进行评估。

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

希望这有帮助。

cosullivan

答案 1 :(得分:0)

问题不在于linq本身, 您需要确保上下文或提供程序对象能够获取数据。 尝试测试

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

对象并查看它们是否已填充或是否按要求运行。

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

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

修改:您是否尝试过返回列表&lt;&gt;收藏?还是一个可枚举的类型?

修改 的实际类型是什么,查询可能无法迭代