Дочерняя коллекция не фильтруется, хотя существует соединение linq to sql - PullRequest
2 голосов
/ 08 апреля 2009

У меня есть запрос LINQ:

var result = from mt in MessageTypes
            join mtfmt in MessageTypeField_MessageTypes
                on new { MessageTypeID = mt.ID, MessageTypeFieldID = messageTypeFieldId } equals new { MessageTypeID = mtfmt.MessageTypeID, MessageTypeFieldID = mtfmt.MessageTypeFieldID }
            where (mt.StatusID == (int)status)
            select mt;

Или, если хотите, лямбда-синтаксис (тот, который я использую) (messageTypeFieldID устанавливается над вызовом var из параметра.):

var messageTypes = context.MessageTypes
                .Join(
                context.MessageTypeField_MessageTypes,
                mt =>
                new
                    {
                        MessageTypeID = mt.ID,
                        MessageTypeFieldID = messageTypeFieldID
                    },
                mtfmt =>
                new
                    {
                        MessageTypeID = mtfmt.MessageTypeID,
                        MessageTypeFieldID = mtfmt.MessageTypeFieldID
                    },
                (mt, mtfmt) =>
                new
                    {
                        mt = mt,
                        mtfmt = mtfmt
                    }
                )
                .Where(x => (x.mt.StatusID == (int)status))
                .Select(x => x.mt);

Я только начал изучать объединения LINQ и подошел к ситуации, когда это требуется в новой настраиваемой таблице (многие-многие), которую я настраиваю, и хочу вернуть все типы сообщений , каждое с их связанное поле , которое находится под 'MessageTypeField_MessageType'.

Моя таблица «MessageTypeField_MessageTypes» представляет собой довольно простую настройку стратегии нормализации, подобную этой, и я должен заявить, что даже несмотря на то, что MessageTypeID «имеет много», это уникальные данные, поэтому они могут быть:

[ID | MessageTypeID | MessageTypeFieldID]
 1    63      10
 1    63      11
 1    63      12

Теперь приведенный выше код выполняет и возвращает запрос, которым я доволен .. (выполняет правильное INNER JOIN), но когда я смотрю на messageTypes.ToList()[0].MessageTypeField_MessageTypes, например, с помощью быстрого просмотра, где я ожидаю увидеть 1 запись , я получаю весь стек записей messageTypeField_MessageType ~ 17, только , отфильтрованных по MessageTypeFieldID, а не по MessageTypeID. Он должен фильтровать по идентификатору типа сообщения на каждой итерации и возвращать только одну запись. Любые идеи о том, что я делаю неправильно, или как я могу добиться того, что мне нужно?

Извините за сложный пример, но я надеюсь, что вы, ребята, можете помочь!

Ответы [ 2 ]

3 голосов
/ 08 апреля 2009

Если вы просматриваете свойство навигации (то есть некоторую дочернюю коллекцию mt), то это не связано с вашим запросом; Похоже, вы хотите использовать AssociateWith. Это в значительной степени заменяет объединение, если вы просто пытаетесь отфильтровать дочерние данные ...

0 голосов
/ 08 апреля 2009

Попробуйте изменить свой выбор на:

 select new 
 {
    MessageType = mt,
    MessageField = mtfmt
 }

Как отметил Марк, изменение запроса не связано со свойствами навигации. Что-то похожее на вышесказанное, вероятно, то, что вы хотели.

Если вы хотите придерживаться свойств навигации, вы должны использовать комбинацию AssociateWith и LoadWith. Первый отфильтровать, а затем сделать его загруженным (чтобы вы не заканчивали несколько циклов).

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