Allan
asked on
LEFT JOIN Issue - LINQ
Hi Experts!
Thanks for reading this.
Having trouble with a simple LINQ to Entity query..
Say you've three tables to hold a Survey:
SurveyQuestions - the questions
SurveyScales - 0) Never 1) Seldom 2) Sometimes 3) Always
SurveyUserAnswers - person taking the survey (saved to table)
Here's the script to create the table and insert dummy data:
So, in T-SQL I've something like this:
But that's not the case.
What I want is:
TIA!
Thanks for reading this.
Having trouble with a simple LINQ to Entity query..
Say you've three tables to hold a Survey:
SurveyQuestions - the questions
SurveyScales - 0) Never 1) Seldom 2) Sometimes 3) Always
SurveyUserAnswers - person taking the survey (saved to table)
Here's the script to create the table and insert dummy data:
CREATE TABLE [dbo].[SurveyQuestions](
[SurveyQuestionID] [int] IDENTITY(1,1) NOT NULL,
[SurveyQuestionCounter] [int] NOT NULL,
[SurveyQuestionText] [nvarchar](500) NOT NULL,
[DateCreated] [datetime] NOT NULL,
CONSTRAINT [PK_dbo.SurveyQuestions] PRIMARY KEY CLUSTERED
(
[SurveyQuestionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[SurveyScales](
[SurveyScaleID] [int] IDENTITY(1,1) NOT NULL,
[SurveyScaleValue] [int] NOT NULL,
[SurveyScaleText] [nvarchar](10) NOT NULL,
[DateCreated] [datetime] NOT NULL,
CONSTRAINT [PK_dbo.SurveyScales] PRIMARY KEY CLUSTERED
(
[SurveyScaleID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[SurveyUserAnswers](
[SurveyUserAnswerID] [int] IDENTITY(1,1) NOT NULL,
[SurveyScaleID] [int] NOT NULL,
[SurveyQuestionID] [int] NOT NULL,
[UserID] [int] NOT NULL,
[DateCreated] [datetime] NOT NULL,
CONSTRAINT [PK_dbo.SurveyUserAnswers] PRIMARY KEY CLUSTERED
(
[SurveyUserAnswerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[SurveyUserAnswers] WITH CHECK ADD CONSTRAINT [FK_dbo.SurveyUserAnswers_dbo.SurveyQuestions_SurveyQuestionID] FOREIGN KEY([SurveyQuestionID])
REFERENCES [dbo].[SurveyQuestions] ([SurveyQuestionID])
GO
ALTER TABLE [dbo].[SurveyUserAnswers] CHECK CONSTRAINT [FK_dbo.SurveyUserAnswers_dbo.SurveyQuestions_SurveyQuestionID]
GO
ALTER TABLE [dbo].[SurveyUserAnswers] WITH CHECK ADD CONSTRAINT [FK_dbo.SurveyUserAnswers_dbo.SurveyScales_SurveyScaleID] FOREIGN KEY([SurveyScaleID])
REFERENCES [dbo].[SurveyScales] ([SurveyScaleID])
GO
ALTER TABLE [dbo].[SurveyUserAnswers] CHECK CONSTRAINT [FK_dbo.SurveyUserAnswers_dbo.SurveyScales_SurveyScaleID]
GO
--INSERTS
INSERT INTO [dbo].[SurveyScales] ([SurveyScaleValue], [SurveyScaleText], [DateCreated]) VALUES (0, 'Never', GETDATE())
INSERT INTO [dbo].[SurveyScales] ([SurveyScaleValue], [SurveyScaleText], [DateCreated]) VALUES (1, 'Seldom', GETDATE())
INSERT INTO [dbo].[SurveyScales] ([SurveyScaleValue], [SurveyScaleText], [DateCreated]) VALUES (2, 'Sometimes', GETDATE())
INSERT INTO [dbo].[SurveyScales] ([SurveyScaleValue], [SurveyScaleText], [DateCreated]) VALUES (3, 'Always', GETDATE())
INSERT INTO [dbo].[SurveyQuestions] ([SurveyQuestionCounter], [SurveyQuestionText], [DateCreated]) VALUES(1, 'Question A', GETDATE())
INSERT INTO [dbo].[SurveyQuestions] ([SurveyQuestionCounter], [SurveyQuestionText], [DateCreated]) VALUES(2, 'Question B', GETDATE())
INSERT INTO [dbo].[SurveyQuestions] ([SurveyQuestionCounter], [SurveyQuestionText], [DateCreated]) VALUES(3, 'Question C', GETDATE())
INSERT INTO [dbo].[SurveyQuestions] ([SurveyQuestionCounter], [SurveyQuestionText], [DateCreated]) VALUES(4, 'Question D', GETDATE())
INSERT INTO [dbo].[SurveyUserAnswers] ([SurveyScaleID], [SurveyQuestionID], [UserID], [DateCreated]) VALUES(1, 1, 1, GETDATE())
INSERT INTO [dbo].[SurveyUserAnswers] ([SurveyScaleID], [SurveyQuestionID], [UserID], [DateCreated]) VALUES(2, 2, 1, GETDATE())
INSERT INTO [dbo].[SurveyUserAnswers] ([SurveyScaleID], [SurveyQuestionID], [UserID], [DateCreated]) VALUES(3, 3, 1, GETDATE())
INSERT INTO [dbo].[SurveyUserAnswers] ([SurveyScaleID], [SurveyQuestionID], [UserID], [DateCreated]) VALUES(4, 4, 1, GETDATE())
INSERT INTO [dbo].[SurveyUserAnswers] ([SurveyScaleID], [SurveyQuestionID], [UserID], [DateCreated]) VALUES(1, 1, 2, GETDATE())
INSERT INTO [dbo].[SurveyUserAnswers] ([SurveyScaleID], [SurveyQuestionID], [UserID], [DateCreated]) VALUES(2, 2, 2, GETDATE())
So, in T-SQL I've something like this:
SELECT sq.SurveyQuestionCounter, sq.SurveyQuestionText, ss.SurveyScaleText, ss.SurveyScaleValue
FROM [dbo].SurveyQuestions sq
LEFT JOIN SurveyUserAnswers sa ON sq.SurveyQuestionID = sa.SurveyQuestionID
INNER JOIN SurveyScales ss ON sa.SurveyScaleID = ss.SurveyScaleID
WHERE sq.SurveyQuestionCounter <= 10 AND
sa.UserID = 2
It returns this:SurveyQuestionCounter SurveyQuestionText SurveyScaleText SurveyScaleValue
---------------------- ------------------- ------- -----------------
1 Question A Never 0
2 Question B Seldom 1
I though with the LEFT JOIN to SurveyUserAnswers it would return all the questions and if there's no user anwer then it's null.But that's not the case.
What I want is:
SurveyQuestionCounter SurveyQuestionText SurveyScaleText SurveyScaleValue
---------------------- ------------------- ------- -----------------
1 Question A Never 0
2 Question B Seldom 1
3 Question C NULL NULL
4 Question D NULL NULL
Would you pleae help write this out in LINQ to Entity?TIA!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I can convert that the TSQL to Linq to entity. thanks for your quick post!