我有这4张桌子:
此查询
var query = db.Authors
.Where(x=> x.ItemAuthors
.Any(z=> z.Item.CategoryItems
.Any(b=> b.categoryID == 10)))
.Select(ci=> new
{
authorText = string.Format("{0} ({1})", ci.text,
ci.ItemAuthors.Count()),
authorId = ci.authorID
});
其中填充了一个按预期工作的作者下拉列表。问题是当我尝试计算分配给每个作者的项目数时,它会计算作者在整个项目表中的每个项目。
例如,如果作者一共有10本书,但在上述查询中只出现了2本书,我仍然可以计算10本书。当我将相同的查询绑定到控件时,我会返回正确的数据,这只是计数操作无法正常工作。
重申我将它绑定到gridview,我只看到每位作者一本书,而不是作者写的所有书籍。所以看来我的查询应该是正确的。
更新: @Jon Skeet,我无法使用let
运算符,因为我有条件地构建了我的查询。我通过使用原始查询来解决我的问题。以下是我修改原始Count()
语法的方法:
var query = authors2.Select(x => new
{
authorText = string.Format("{0} ({1})",x.text, x.ItemAuthors
.Where(qq=> qq.Item.CategoryItems
.Any(xt=> xt.categoryID == 10))
.Count()),
authorId = x.authorID
});
答案 0 :(得分:1)
您正在使用i.Author.ItemAuthors.Count()
直接返回完整表格。我怀疑你可能想要这样的东西:
var query = from ia in db.ItemAuthors
let count = ia.CategoryItems.Count(t => t.categoryID == 10))
where count > 0
select new
{
authorText = string.Format("{0} ({1})", i.Author.text, count),
authorId = i.Author.authorID
};
另一方面,我希望能给出一个每个ItemAuthor 的结果,这不是你想要的。如果你想要一个 authors 的列表,我希望从Authors表中开始查询:
var query = from author in db.ItemAuthors
let count = author.Items
.Count(ia => ia.Item.CategoryItems
.Any(ci => ci.CategoryID == 10))
select new
{
authorText = string.Format("{0} ({1})", author.text, count),
authorId = author.authorID
};
换句话说,对于每个作者,找出有多少项目至少有一个ID为10的类别...然后报告那么多项目。
由于各种1-many关系(每本书可能有多个作者和多个类别),这有点复杂。