Формирование результатов запроса EF LINQ с использованием нескольких таблиц - PullRequest
0 голосов
/ 17 января 2011

Ниже приведен простой запрос LINQ EF с использованием синтаксиса метода.Я использую свой оператор Include для объединения четырех таблиц: Event и Doc - две основные таблицы, EventDoc - таблица ссылок «многие ко многим», а DocUsage - таблица поиска.

Моя проблема в том, что яЯ хотел бы формировать свои результаты, выбирая только определенные столбцы из каждой из четырех таблиц.Но компилятор дает компилятору сообщение об ошибке:

'System.Data.Objects.DataClasses.EntityCollection не содержит определения для "Doc" и не имеет метода расширения "Doc", принимающего первыйаргумент типа 'System.Data.Objects.DataClasses.EntityCollection' может быть найден.

Я уверен, что это что-то легкое, но я не могу понять это. Я не смог найтиНапример, кто-то использует мульти-таблицу, но также формирует проекцию.

Thx, Mark

var qry= context.Event
    .Include("EventDoc.Doc.DocUsage")
    .Select(n => new
    {
        n.EventDate,
        n.EventDoc.Doc.Filename,  //<=COMPILER ERROR HERE
        n.EventDoc.Doc.DocUsage.Usage
    })
    .ToList();

    EventDoc ed;
    Doc d = ed.Doc;  //<=NO COMPILER ERROR SO I KNOW MY MODEL'S CORRECT
    DocUsage du = d.DocUsage;

alt textalt text

1 Ответ

1 голос
/ 17 января 2011

Очень трудно понять, что происходит без скриншота вашей модели, включая навигационные свойства для каждой сущности.

Но если вы говорите, что между многими множителями Событие и Doc EventDoc таблицей соединений), и если предположить, что ваша таблица соединений не имеет ничего, кроме FK, и, следовательно, ее не нужно отображать, то не должно быть ни одного Событие имеет много Документ ?

Этот запрос:

var query = ctx.Event.Include("EventDoc.Doc");

Подразумевает (основываясь на отсутствии множественного числа): одно событие имеет один EventDoc, который имеет один документ.

Но не должно ли это быть: одно событиеимеет один EventDoc, который имеет много документов.

Поэтому ваша проекция на самом деле не имеет смысла.Вы пытаетесь проецировать на анонимный тип с EventDate и Имя файла для одного документа, но событие имеет много документов.

Возможнопроекция, подобная этой, была бы более подходящей:

var query = ctx.Event.Include("EventDoc.Docs.DocUsage")
                     .Select(x => new
                     {
                        EventDate = x.EventDate,
                        DocsForEvent = x.EventDocs.Docs
                     }).ToList();

И для этого вам нужно исправить свою модель.Я удивлен, что он даже проверяет / компилирует.

Либо ваша модель неверна, либо вы описываете количество элементов базы данных в вашем вопросе.:)

Конечно, я мог бы неправильно понять вашу базу данных и / или модель - поэтому, если я сообщу мне, и я удалю этот ответ.

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