0

这个工作怎么来的

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

2 回答 2

3

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

pcm.PostId == 1

pcm.PostId == postId

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

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

希望这可以帮助。

科沙利文

于 2008-11-14T13:50:29.803 回答
0

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

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

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

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

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

编辑:您是否尝试返回 List<> 集合?还是 Enumerable 类型?

编辑:项目的真实类型是什么,查询可能不可迭代

于 2008-11-14T11:35:39.640 回答