我已经工作了几个小时才能完成一些事情,这会花费我一分钟的TSQL。当我将join语句添加到此方法时,VS会抱怨模糊调用。当我鼠标移动时,"。"弹出提示在一个监视器上运行到另一个监视器,因此我很难从中提取任何非常有用的信息。如果我注释掉.Join条款,一切都很开心。
感谢任何指导。
public List<CategoryDto> Categories(int departmentId)
{
IQueryable<CategoryDto> categories = null;
List<CategoryDto> categoriesList = null;
using (var context = new ApplicationDbContext())
{
categories = context.Categories
.Join(context.CategoryImages, j => j.CategoryId, c => c.CategoryId,
(j, c) => new { CategoryImages = j, Categories = c })
.Where(c => c.DepartmentId == departmentId)
.OrderBy(c => c.Name)
.Select(category => new CategoryDto
{
CategoryId = category.CategoryId,
DepartmentId = category.DepartmentId,
Name = category.Name,
Description = category.Description,
DisplayOrderRank = category.DisplayOrderRank,
IsActive = category.IsActive
});
if (categories != null) categoriesList = categories.ToList();
}
return categoriesList;
}
答案 0 :(得分:3)
使用......
.Join(context.CategoryImages, j => j.CategoryId, c => c.CategoryId,
(j, c) => new { CategoryImages = j, Categories = c })
...你创建了一个IQueryable<T>
,其中T是一个具有两个属性CategoryImages
和Categories
的匿名类型(尽管你的顺序错误,但它也是更好地使用单数词)。因此,您必须使用此匿名类型继续LINQ语句,例如......
.Where(x => x.Categories.DepartmentId == departmentId)
如评论中所述,使用连接综合语法更容易:
from c in context.Categories
join i in context.CategoryImages on c.CategoryId equals i.CategoryId
where c.DepartmentId == departmentId // now this is OK
但更好的是不要编写连接并使用导航属性,例如Category.Images
。顺便说一下,我不确定你为什么要访问Images
,因为你没有在最终结果中使用它们。目前,加入的唯一效果是您可能获得非唯一类别。