Linq to sql 有关意外LINQ查询结果的帮助
我有这4张桌子: 这个问题Linq to sql 有关意外LINQ查询结果的帮助,linq-to-sql,Linq To Sql,我有这4张桌子: 这个问题 var query = db.Authors .Where(x=> x.ItemAuthors .Any(z=> z.Item.CategoryItems .Any(b=> b.categoryID == 10))) .Select(ci=> new
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
});
它填充按预期工作的“作者”下拉列表。问题是,当我试图计算分配给每个作者的项目数时,它会计算作者在整个项目表中拥有的每个项目
例如,如果author one总共有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
});
您使用的是直接返回到完整表的
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表开始:
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关系(每本书都可能有多个作者和多个类别)。您还没有显示您试图进行计数的代码。。。请显示不起作用的代码。它在我的select new语句中,通过authorText
你必须滚动。哎哟-因为滚动,我没有看到它。它值得格式化,这样我们就不必这样做。。。现在回答。它说的是author.Items
没有包含计数的定义。@Nick:author.Items
的类型是什么?我认为应该是Item
,这是Items表类。我已经更新了问题中的代码,以反映authors表。@尼克:您没有显示的是类之间的所有关系。您已经显示了表,但没有显示实体中的关系。但希望我已经给了你足够的一个开始,让你自己解决剩下的问题。我更新了我的问题,以反映我是如何解决这个问题的。不过,我会接受你的回答,因为它让我走上了正确的道路。谢谢