Пытаюсь выучить синтаксис Linq и борюсь с выражениями на основе методов. У меня есть 8 таблиц, которые позволяют пользователям связываться с группами и организациями и имеют формы, связанные с группами. Для дальнейшего объяснения я назначаю форму группе. Этой группе может быть назначен пользователь напрямую или через организацию, к которой он принадлежит. Мне нужен оператор Linq, который будет правильно объединять / объединять таблицы, чтобы я мог возвращать формы, назначенные данному пользователю. Вот основная схема:
Редактировать 25 февраля
1. Обратите внимание, что я использую VS2010 и компилирую 4.0.
2. Убрал столбец pk id из всех таблиц ссылок и включил «Включить столбцы внешнего ключа» в мастере, который очистил макет edmx (теперь таблицы ссылок связаны с наборами наборов вице-сущностей)
3. Добавлены табличные скрипты (вырвано немного пуха) и добавлен edmx, сгенерированный дизайнером
4. Переписал мой t-sql с использования предложения IN на EXISTS, все еще работает
5. Еще читаю и тестирую edmx с LinqPad, вздох ...
CREATE TABLE [dbo].[Org](
[orgID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
CONSTRAINT [PK_Org] PRIMARY KEY CLUSTERED
(
[orgID] ASC
)
CREATE TABLE [dbo].[Groups](
[groupID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED
(
[groupID] ASC
)
CREATE TABLE [dbo].[Form](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
CONSTRAINT [PK_Form] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
CREATE TABLE [dbo].[Users](
[userID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[userID] ASC
)
###############################################################
Link tables and FKs
###############################################################
CREATE TABLE [dbo].[User_Org](
[userID] [int] NOT NULL,
[orgID] [int] NOT NULL)
ALTER TABLE [dbo].[User_Org] WITH CHECK ADD CONSTRAINT [FK_User_Org_Org] FOREIGN KEY([orgID])
REFERENCES [dbo].[Org] ([orgID])
ALTER TABLE [dbo].[User_Org] CHECK CONSTRAINT [FK_User_Org_Org]
ALTER TABLE [dbo].[User_Org] WITH CHECK ADD CONSTRAINT [FK_User_Org_Users] FOREIGN KEY([userID])
REFERENCES [dbo].[Users] ([userID])
ALTER TABLE [dbo].[User_Org] CHECK CONSTRAINT [FK_User_Org_Users]
###############################################################
CREATE TABLE [dbo].[User_Group](
[userID] [int] NOT NULL,
[groupID] [int] NOT NULL)
ALTER TABLE [dbo].[Org_Group] CHECK CONSTRAINT [FK_Org_Group_Org]
ALTER TABLE [dbo].[User_Group] WITH CHECK ADD CONSTRAINT [FK_User_Group_Group] FOREIGN KEY([groupID])
REFERENCES [dbo].[Groups] ([groupID])
ALTER TABLE [dbo].[User_Group] CHECK CONSTRAINT [FK_User_Group_Group]
ALTER TABLE [dbo].[User_Group] WITH CHECK ADD CONSTRAINT [FK_User_Group_Users] FOREIGN KEY([userID])
REFERENCES [dbo].[Users] ([userID])
ALTER TABLE [dbo].[User_Group] CHECK CONSTRAINT [FK_User_Group_Users]
###############################################################
CREATE TABLE [dbo].[Org_Group](
[orgID] [int] NOT NULL,
[groupID] [int] NOT NULL)
ALTER TABLE [dbo].[Org_Group] WITH CHECK ADD CONSTRAINT [FK_Org_Group_Group] FOREIGN KEY([groupID])
REFERENCES [dbo].[Groups] ([groupID])
ALTER TABLE [dbo].[Org_Group] CHECK CONSTRAINT [FK_Org_Group_Group]
ALTER TABLE [dbo].[Org_Group] WITH CHECK ADD CONSTRAINT [FK_Org_Group_Org] FOREIGN KEY([orgID])
REFERENCES [dbo].[Org] ([orgID])
###############################################################
CREATE TABLE [dbo].[Form_Group](
[FormID] [int] NOT NULL,
[groupID] [int] NOT NULL)
ALTER TABLE [dbo].[Form_Group] WITH CHECK ADD CONSTRAINT [FK_Form_Group_Form] FOREIGN KEY([FormID])
REFERENCES [dbo].[Form] ([ID])
ALTER TABLE [dbo].[Form_Group] CHECK CONSTRAINT [FK_Form_Group_Form]
ALTER TABLE [dbo].[Form_Group] WITH CHECK ADD CONSTRAINT [FK_Form_Group_Groups] FOREIGN KEY([groupID])
REFERENCES [dbo].[Groups] ([groupID])
ALTER TABLE [dbo].[Form_Group] CHECK CONSTRAINT [FK_Form_Group_Groups]
Паршивое утверждение T-SQL, которое дает мне то, что я хочу:
declare @userid int
set @userid = 1
select distinct(f.id)
from Form f
join Form_Group fg on f.id = fg.formid
join Groups g on fg.groupid = g.groupid
where exists
((select g1.groupid
from Groups g1
join User_Group ug on g1.groupid = ug.groupid
join Users u on ug.userid = u.userid
where u.userid = @userid
and g.groupid = g1.groupid)
union
(select g2.groupid
from Groups g2
join Org_group og on g2.groupid = og.groupid
join Org o on og.orgid = o.orgid
join User_org uo on o.orgid = uo.orgid
join Users u on uo.userid = u.userid
where u.userid = @userid
and g.groupid = g2.groupid)
)
Пожалуйста и спасибо!