Попытка изучить синтаксис Linq и бороться с основанными на методах выражениями vs. У меня есть 8 таблиц, которые позволяют пользователям связываться с группами и организациями и иметь формы, связанные с группами. Для дальнейшего объяснения, я назначаю форму группе. У этой группы может быть пользователь, назначенный напрямую или через организацию, к которой принадлежит пользователь. Мне нужен оператор Linq, который будет правильно связывать/объединять таблицы, чтобы я мог вернуть формы, назначенные данному пользователю. Вот базовая схема:Linq to Entities Join/Union Statement Help
Редактировать 25 фев.
1. Примечание. Я использую VS2010 и компилирую 4.0.
2. Удален столбец pk id из всех таблиц ссылок и включен «Включить столбцы внешнего ключа» в мастере, который очистил макет edmx (теперь в таблицах ссылок теперь установлены ассоциации наборов наборы сущностей)
3. Добавлены скрипты таблиц (вырезаны некоторые пуха) и добавил EDMX, сгенерированный дизайнером
4. переписаны мой T-SQL с использованием в пункте для 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)
)
Пожалуйста и спасибо!
Отъезд LinqPad – Zyphrax
Да, я общался с LinqPad и еще не наткнулся на правильную комбинацию. Благодарю. Я только что зарегистрировался здесь, поэтому я не могу ссылаться на jpg моего edmx еще .... – Andy