将连接添加到dbContext查询时出现模糊调用错误

时间:2014-04-26 23:28:24

标签: linq lambda dbcontext

我已经工作了几个小时才能完成一些事情,这会花费我一分钟的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;
    }

1 个答案:

答案 0 :(得分:3)

使用......

.Join(context.CategoryImages, j => j.CategoryId, c => c.CategoryId,
                (j, c) => new { CategoryImages = j, Categories = c })

...你创建了一个IQueryable<T>,其中T是一个具有两个属性CategoryImagesCategories的匿名类型(尽管你的顺序错误,但它也是更好地使用单数词)。因此,您必须使用此匿名类型继续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,因为你没有在最终结果中使用它们。目前,加入的唯一效果是您可能获得非唯一类别。