2013-01-09 51 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的文档说你不能做这样的事情“连接”操作符,因为它只支持同等物。

解决方案是首先构建笛卡尔积并从那里限制结果集。