Linq to sql 将SQL转换为LINQ

Linq to sql 将SQL转换为LINQ,linq-to-sql,Linq To Sql,我正在尝试将SQL查询转换为LINQ查询。任何帮助都将不胜感激。 以下是我的SQL查询: SELECT DISTINCT U.UserID, U.LoginID, U.FirstName, U.LastName, U.IsActive, U.IsApproved, U.Email, U.DateLastLogin, CONVERT(VARCHAR, U.DateLastLogin, 101) AS LastLogin, U.JobTitle, U.AgencyName,

我正在尝试将SQL查询转换为LINQ查询。任何帮助都将不胜感激。 以下是我的SQL查询:

SELECT DISTINCT
 U.UserID,
 U.LoginID,
 U.FirstName,
 U.LastName,
 U.IsActive,
 U.IsApproved,
 U.Email,
 U.DateLastLogin,
 CONVERT(VARCHAR, U.DateLastLogin, 101) AS LastLogin,
 U.JobTitle,
 U.AgencyName,
 U.WorkPhone,
 U.Fax,
 U.MobilePhone,
 U.Satellite,
 U.Blackberry,
 U.Pager,
 U.Address1,
 U.Address2,
 U.City,
 U.StateAbbr,
 U.ZipCode,
 G.[Name] AS GroupName,
 COALESCE( B.UserID, 0 ) AS BTC

 FROM dbo.Users U

 INNER JOIN dbo.Users_Grantee UG ON U.UserID = UG.UserID

 INNER JOIN dbo.Users_Groups UGRP ON UG.UserID = UGRP.UserID
 INNER JOIN dbo.Groups G ON UGRP.GroupID = G.GroupID

 --Flag for BTC Users
 LEFT OUTER JOIN (
      SELECT UG2.UserID
      FROM dbo.Users_Groups UG2
      INNER JOIN dbo.Groups G2 ON UG2.GroupID = G2.GroupID
      WHERE G2.GroupClass_ID = 44
 ) B ON U.UserID = B.UserID

 WHERE U.IsAdminUser = 0
 AND  U.IsActive = @IsActive
 AND  UG.GranteeID = @GranteeID
 AND  G.GroupClass_ID = 1 --Grantee GroupClass
 AND  (U.LastName  LIKE @LastName
  OR   U.FirstName LIKE @FirstName
  OR   U.Email     LIKE @Email
  OR   U.LoginID = @LoginID)


 --Exclude PO users who have grantee access.
 AND NOT EXISTS(
     SELECT 1
     FROM dbo.Users_Groups UG1
     INNER JOIN dbo.Groups G1 ON UG1.GroupID = G1.GroupID
     WHERE UG1.UserID = UG.UserID
     AND  G1.GroupClass_ID <> 1
     AND  G1.GroupClass_ID <> 44
      )

不知何故,我通过以下查询实现了这一点:

(from u in Users
     from ugrt in Users_Grantees where (u.UserID == ugrt.UserID)
     from ugrp in Users_Groups where (ugrt.UserID == ugrp.UserID)
     from g in Groups where (ugrp.GroupID == g.GroupID)
    from ug in 
        (from  ug2 in Users_Groups
            join g2 in Groups on ug2.GroupID equals g2.GroupID
                where (g2.GroupClass_ID == 44)
            select new {ug2.UserID}).Where(ug=>ug.UserID == u.UserID).DefaultIfEmpty()
            where   
            u.IsAdminUser == false
            && u.IsActive == true
            && ugrt.GranteeID == 1
            && g.GroupClass_ID == 1
            orderby u.LastName
            select u) 
            .Where (t1 => !(from ugrp1 in Users_Groups 
                join g1 in Groups on ugrp1.GroupID equals g1.GroupID
                where (g1.GroupClass_ID != 1
                    && g1.GroupClass_ID != 44)
                    select new {ugrp1.UserID})
                    .Any(t2 => t2.UserID == t1.UserID))

作为LINQ查询,这似乎太长了,为什么需要在LINQ中完成?我建议将其放在一个视图中,但要在LINQ查询中过滤需要参数的部分。可能很难转换,因为不应该这样做?具体来说,JOIN+distinct该视图或存储过程属于数据库。