Предложение IN из включенной таблицы не работает должным образом
Я пытаюсь сделать это:
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, и Группа делает так много соединений, чем элементы в списке, и даже то, что он не работает должным образом.
Любая идея?
РЕДАКТИРОВАНИЕ
Я нашел ошибку в своей схеме базы данных, теперь ошибка, которую я получаю с
.Where("it.Group.IdGroup in {1,2,3,4,5}")
Является
"IdGroup" не является членом "Transient.collection[myModel.Group(Nullable=True,DefaultValue=)]". Чтобы извлечь свойство элемента коллекции, используйте подзапрос для перебора коллекции.
2 ответа
Вы можете попробовать это:
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);
}
}
Код 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))