2013-05-09 124 views
0

如何将此SQL语句转换为LINQ to Entities。我不能找到一种方法,工会与表WHERE子句SQL转换为LINQ to Entities

SQL:

Declare @DID int, @key varchar(50) 

SET @DID = 3 
SET @key = '' 

SELECT TBL.GID, TBL.GName, TBL.DID FROM  
(
    SELECT TOP 1 (@DID*10000) AS [GID], '' AS [GName], @DID AS [DID] 
    FROM dbo.Employees E 
    WHERE [email protected] 
    AND (E.GroupID IS NULL OR E.GroupID = 0) 
    UNION ALL 
    SELECT G.GroupID AS [GID], G.GroupName AS [GName], G.DepartmentID AS [DID] 
    FROM dbo.Groups G 
) TBL 
WHERE TBL.DID IN (@DID) 
AND TBL.GName IN 
(
    SELECT (CASE WHEN E.GroupID = 0 or E.GroupID IS NULL THEN '' 
      ELSE (SELECT G.GroupName FROM Groups G WHERE G.GroupID=E.GroupID) END) 
    FROM Employees E 
    WHERE E.DepartmentID = @DID 
    AND (E.FirstName + ' ' + E.LastName) LIKE '%' + @key + '%' 
) 
ORDER BY TBL.GName DESC 

LINQ到的entites:

var Details = (from a in Context.Employees 
       where a.DepartmentID == DepartmentID 
       && (a.GroupID == null || a.GroupID == 0) 

       select new 
       { 
       GID = Convert.ToInt32(DepartmentID * 10000), 
       GName = "", 
       DID = a.DepartmentID 
       } 

       ).Concat(
       from a in Context.Groups 
       select new 
       { 
        GID = a.GroupID, 
        GName = a.GroupName, 
        DID = DepartmentID 
       } 
       ); 

回答

0

在结果产生的匿名类型每个查询都是不同的类型,所以你不能Concat()他们。你可以定义一个通用Group类这样的...

class Group 
{ 
    public int ID { get; set; } 
    public int DepartmentID { get; set; } 
    public string Name { get; set; } 
} 

然后拉出子查询和创建结果作为上述类的实例...

int deptID = 99; 
string key = "foo"; 

var r1 = (from a in Context.Employees 
      where a.DepartmentID == deptID 
      && (!a.GroupID.HasValue || a.GroupID == 0) 
      select new Group() 
      { 
      ID = a.DepartmentID * 10000, 
      Name = string.Empty, 
      DepartmentID = a.DepartmentID 
      } 
     ).Take(1); 

var r2 = (from a in Context.Groups 
      where a.DepartmentID == deptID 
      select new Group() 
      { 
      ID = a.GroupID, 
      Name = a.GroupName, 
      DepartmentID = a.DepartmentID 
      } 
     ); 

var results = r1.Concat(r2); // UNION ALL the above 2 sets of results 

然后创建过滤器设置并最终使用它过滤从上面的结果...

var filter = (from e in Context.Employees 
       join g in Context.Groups on g.GroupID equals e.GroupID into eg 
       from subgrp in eg.DefaultIfEmpty() 
       where e.DepartmentID == deptID 
       && (e.FirstName + " " + e.LastName).Contains(key) 
       select e.GroupID.HasValue && e.GroupID != 0 ? subgrp.GroupName : string.Empty 
      ).Distinct().ToList(); 

results = from a in results 
      where filter.Contains(a.Name) 
      orderby a.Name descending 
      select a; 

随意评论,如果没有做到你所需要的。