2013-01-09 118 views
1
CREATE TABLE PersonTask 
(
PersonId INT NOT NULL, 
WeekId INT NOT NULL, 
WeekDaysTaskId INT, 
WeekEndTaskId INT 
) 
GO 
CREATE TABLE Task 
(
Id INT PRIMARY KEY, 
[Description] VARCHAR(250) NOT NULL 
) 
GO 
INSERT INTO Task(Id, [Description]) VALUES(1, 'Task-01') 
INSERT INTO Task(Id, [Description]) VALUES(2, 'Task-02') 
INSERT INTO Task(Id, [Description]) VALUES(3, 'Task-03') 
GO 
INSERT INTO PersonTask(PersonId, WeekId, WeekDaysTaskId, WeekEndTaskId) VALUES(1, 1, NULL, 1) 
INSERT INTO PersonTask(PersonId, WeekId, WeekDaysTaskId, WeekEndTaskId) VALUES(1, 2, 2, NULL) 
INSERT INTO PersonTask(PersonId, WeekId, WeekDaysTaskId, WeekEndTaskId) VALUES(1, 3, 3, 3) 
GO 

SELECT 
     PT.PersonId, 
     WeekId, 
     'Not on Bench' as [Status] 
    FROM PersonTask AS PT 
    INNER JOIN Task AS T ON T.Id IN (PT.WeekDaysTaskId, PT.WeekEndTaskId) 
    WHERE WeekId = 3/*Param-1*/ and PersonId = 1/*Param-2*/ 

我想寫一個相當於上面的T-sql語句,但徒勞的linq查詢。有人可以幫忙用C#Linq查詢來獲取上面的T-SQL語句。LINQ等價語句的SQL內部加入IN語句

+0

好的,你使用EF還是Linq-to-SQL?我不認爲你可以使用兩者(也許你打算使用'linq-to-entities'標籤)。另外,你是否想要將SELECT語句轉換爲LINQ查詢? – IronMan84

+0

@ IronMan84,Linq-To-SQL。 – teenboy

回答

1

必須是這樣的(前提是你要有personTaskQueryable和taskQueryable):

from pt in personTaskQueryable 
from t in taskQueryable 
where (t.Id == pt.WeekDaysTaskId || t.Id == pt.WeekEndTaskId) 
    && pt.WeekId == 3 && pt.PersonId == 1 
select new { pt.PersonId, pt.WeekId, Status = "Not on Bench" } 

我沒有嘗試,因爲我是直接在回答文本編碼,但LINQ的文檔說你不能做這樣的事情「連接」操作符,因爲它只支持同等物。

解決方案是首先構建笛卡爾積並從那裏限制結果集。