Предложение IN из включенной таблицы не работает должным образом - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь сделать это:

        var results = (from s in db.ExampleMaster
                           .Include("State")
                           .Include("Group")
                           .Where("it.Group.IdGroup in {1,2,3,4,5}")
                           .Where("it.IdState in {1,2}")
                            select s);

Схема:

ExampleMaster:
    IdExampleMaster int,
    IdState int

State:
    IdState int,
    Description varchar(100)

Group:
    IdGroup int
    IdExampleMaster int

Требуемый SQL выглядит так:

SELECT * FROM ExampleMaster e
inner join State s on s.IdState = e.IdState
Inner join Group g on e.IdExampleMaster = g.IdExampleMaster 
where g.IdGroup in (1,2,3,4,5) and e.IdState in (1,2)

Сгенерированный SQLэто как:

SELECT *
    FROM ExampleMaster AS [Extent1]
    LEFT OUTER JOIN [dbo].[Group] AS [Extent2] ON [Extent1].[IdExampleMaster] = [Extent2].[IdGroup]
    LEFT OUTER JOIN [dbo].[Group] AS [Extent3] ON [Extent2].[IdGroup] = [Extent3].[IdGroup]
    LEFT OUTER JOIN [dbo].[Group] AS [Extent4] ON [Extent2].[IdGroup] = [Extent4].[IdGroup]
    LEFT OUTER JOIN [dbo].[Group] AS [Extent5] ON [Extent2].[IdGroup] = [Extent5].[IdGroup]
    LEFT OUTER JOIN [dbo].[Group] AS [Extent6] ON [Extent2].[IdGroup] = [Extent6].[IdGroup]
    LEFT OUTER JOIN [dbo].[Group] AS [Extent7] ON [Extent2].[IdGroup] = [Extent7].[IdGroup]
    LEFT OUTER JOIN [dbo].[State] AS [Extent8] ON [Extent1].[IdState] = [Extent8].[IdState]
    WHERE ([Extent1].[IdState] IN (1,2)) AND ([Extent3].[IdGroup] = 1 OR [Extent4].[IdGroup] = 2 OR [Extent5].[IdGroup] = 3 OR [Extent6].[IdGroup] = 4 OR [Extent7].[IdGroup] = 5) ) AS [Filter1]

Я не понимаю, почему регистр состояний (таблица не требуется) хорошо работает с предложением IN, и Группа делает так много соединений, чем элементов в списке, и даже не делает этогоt работает как положено.

Есть идеи?


EDITED

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

.Where("it.Group.IdGroup in {1,2,3,4,5}")

Is

'IdGroup' не является членом 'Transient.collection [myModel.Group (Nullable = True, DefaultValue =)]'.Чтобы извлечь свойство элемента коллекции, используйте подзапрос для перебора коллекции

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Код LINQPad, который, кажется, дает ожидаемый результат в соответствии с вопросом

(имена схем: 'master', 'state', 'group' во множественном числе с помощью самого LINQPad)

Masters
    .Join(
        States, 
        master => master.Idstate, 
        state => state.Idstate,
        (master,state) => new
            {
                idmaster = master.Idmaster,
                idstate = state.Idstate,
                descr = state.Descr
            }
        )
    .Join(
        Groups,
        firstJoin => firstJoin.idmaster,
        groups=>groups.Idmaster,
        (firstJoin, groups) => new
            {
                masterid = firstJoin.idmaster,
                stateid = firstJoin.idstate,
                groupid = groups.Idgroup,
                descr = firstJoin.descr
            }
        )
    .Where(x => new int?[]{1,2,3,4,5}.ToList().Contains(x.groupid))
    .Where(x => new int?[]{1,2}.ToList().Contains(x.stateid))
0 голосов
/ 04 декабря 2011

Вы можете попробовать это:

LINQ:

from e in ExampleMaster
join s in State on e.IdState equals s.IdState
join g in Group on e.IdExampleMaster = g.IdExampleMaster
where g.IdGroup.In(1,2,3,4,5) && e.IdState.In(1,2)
select e;

Создать метод расширения для In:

public static class IntExtensions
{
    public static bool In(this int @this, params int[] values)
    {
      return values.Contains(@this);
    }
}
...