帮助处理意外的LINQ查询结果

时间:2011-04-12 06:37:00

标签: linq-to-sql

我有这4张桌子: enter image description here

此查询

    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

            });

1 个答案:

答案 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关系(每本书可能有多个作者多个类别),这有点复杂。