怎么来这个工作
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;
}
答案 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;收藏?还是一个可枚举的类型?
修改 项的实际类型是什么,查询可能无法迭代