Link to home
Start Free TrialLog in
Avatar of Allan
AllanFlag for United States of America

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:
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())

Open in new window


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	

Open in new window

It returns this:
SurveyQuestionCounter  SurveyQuestionText    SurveyScaleText SurveyScaleValue
---------------------- -------------------   -------         -----------------
1                      Question A            Never           0
2                      Question B            Seldom          1

Open in new window

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

Open in new window

Would you pleae help write this out in LINQ to Entity?

TIA!
ASKER CERTIFIED SOLUTION
Avatar of coreconcepts
coreconcepts
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Allan

ASKER

ahh.. that makes sense.
I can convert that the TSQL to Linq to entity. thanks for your quick post!