Помощь с неожиданными результатами запроса LINQ - PullRequest
0 голосов
/ 12 апреля 2011

У меня есть эти 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 книг, но в приведенном выше запросе отображаются только две из этих книг, я все равно получаю счет за 10 книг. Когда я связываю тот же запрос с элементом управления, я получаю правильные данные, это просто операция подсчета, которая не будет работать правильно.

Чтобы повторить, я связал его с сеткой, и я вижу только одну книгу на автора, а не все книги, которые автор написал. Похоже, мой запрос должен быть правильным.

Обновление: @ Джон Скит, я не смог использовать оператор 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 Ответ

1 голос
/ 12 апреля 2011

Вы используете 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 , что на самом деле не то, чтоты хочешь.Если вы хотите получить список авторов , я бы ожидал запрос, начинающийся в таблице авторов:

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
            };

Другими словами, для каждого автора выясните, сколько элементов вхотя бы одну категорию с идентификатором 10 ... и затем сообщите о таком количестве элементов.

Это несколько сложно из-за различных отношений 1-много (каждая книга может иметь несколько авторов и несколько категорий).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...