簡體   English   中英

如何將此 SQL 語句轉換為 Lambda/Linq 表達式

[英]How to convert this SQL statement into a Lambda/Linq expression

我正在尋找此 SQL 語句的等效 LINQ Lambda 表達式。

SELECT A.USER_ID, A.GIVEN_NAME, A.SURNAME, A.REGION, A.EMAIL 
FROM USER A
WHERE A.USER_ID IN (
    SELECT B.USER_ID_TXT 
    FROM TRAINING_COURSE B
    WHERE B.COURSE_ID_TXT IN 
        (SELECT C.MITT_COURSE_ID_TXT 
            FROM TRAINING_MITT C 
            WHERE C.TRAINING_ID =
                (SELECT D.TRAINING_ID 
                 FROM TRAINING_ROLE D 
                 WHERE D.ROLE_ID = 3011)))

這里是實體。 我添加了一些注釋來說明 SQL 查詢中對 TABLES 和 FIELDS 的引用。

該表存儲用戶信息,並作為物化視圖安裝。

// TABLE USER 
public class TCUser
{
    // Field USER_ID
    public string UserId { get; set; }
    public string GivenName { get; set; }
    public string Surname { get; set; }
    public string OfficeBuilding { get; set; }
    public string Address { get; set; }
    public string FloorLocation { get; set; }
    public string FloorNumber { get; set; }
    public string Region { get; set; }
    public string Province { get; set; }
    public string PostalCode { get; set; }
    public string City { get; set; }
    public string Email { get; set; }
}  

下一個表店培訓課程,它來自外部來源。 它基本上是數據的導入。

// TABLE TRAINING_COURSE - EXTERNAL SOURCE
public class TrainingCourse
{
    // Field USER_ID_TXT
    public String UserId { get; set; }

    // Field COURSE_ID_TXT
    public String CourseId { get; set; }
    public String CourseDescription { get; set; }
    public String ScheduleId { get; set; }
    public String ScheduleDescription { get; set; }
    public DateTime? ScheduleStartDate { get; set; }
    public DateTime? ScheduleEndDate { get; set; }
    public String Status { get; set; }
}

該表將完成角色所需的培訓課程關聯起來。

// TABLE TRAINING_ROLES - XREF between TRAINING_MITT and ICS_ROLE
public class IcsTrainingRole
{
     // Field ROLE_ID
     public int RoleId { get; set; }

     // Field TRAINING_ID
     public int TrainingId { get; set; }
     public virtual IcsTraining IcsTraining { get; set; }
     public virtual IcsRole IcsRole { get; set; }
}

該表將 Training 與外部 MITT Training DB 關聯起來

// TABLE TRAINING_MITT
public class IcsTrainingMitt
{
    // Field TRAINING_ID             
    public int TrainingId { get; set; }

    // Field MITT_COURSE_ID_TXT
    public string MittCourseId { get; set; }
    public virtual IcsTraining IcsTraining { get; set; }
}

public class IcsTraining
{
    public int TrainingId { get; set; }
    public string TrainingName { get; set; }
    public virtual ICollection<IcsTrainingRole> IcsTrainingRoles { get; set; }
    public virtual ICollection<IcsTrainingMitt> IcsTrainingMitt { get; set; }
}


public class IcsRole
{
    public int RoleId { get; set; }
    public int SectionId { get; set; }
    public string RoleName { set; get; }
    public virtual ICollection<IcsTrainingRole> IcsTrainingRoles { get; set; }
}

如果您使用連接重新編寫代碼,它將如下所示:

SELECT A.USER_ID, A.GIVEN_NAME, A.SURNAME, A.REGION, A.EMAIL 
FROM USER A
JOIN TRAINING_COURSE B ON A.USER_ID = B.USER_ID_TXT
JOIN TRAINING_MITT C ON B.COURSE_ID_TXT = C.MITT_COURSE_ID
JOIN TRAINING_ROLE D ON C.TRAINING_ID = D.TRAINING_ID AND D.ROLE_ID = 3011

通過使用連接(如 Hogan 所建議的)將 Linq 查詢語法與您的模型類結合使用:

var users = from u in TCUser
            join tc in TrainingCourse on u.UserId equals tc.UserId
            join tm in IcsTrainingMitt on tc.CourseId equals tm.MittCourseId
            join tr in IcsTrainingRole on tm.TrainingId equals tr.TrainingId
            where tr.RoleId == 3011
            select new
            {
                UserId = u.UserId,
                GivenName = u.GivenName,
                Surname = u.Surname,
                Email = u.Email
            };

我認為查詢語法應該比使用 lambda 更清晰,因為該模型似乎缺乏適當的導航屬性。

好的,使用 join 實際上更簡單,並且基於@kaffekopp 的帖子,使用 lambdas 的等效表達式將是:

var users = TCUser
    .Join(TrainingCourse, u => u.UserId, tc => tc.UserId, (u, tc) => new {u, tc})
    .Join(IcsTrainingMitt, @t => @t.tc.CourseId, tm => tm.MittCourseId, (@t, tm) => new {@t, tm})
    .Join(IcsTrainingRole, @t => @t.tm.TrainingId, tr => tr.TrainingId, (@t, tr) => new {@t, tr})
    .Where(@t => @t.tr.RoleId == 3011)
    .Select(@t => new
    {
        UserId = @t.@t.@t.u.UserId,
        GivenName = @t.@t.@t.u.GivenName,
        Surname = @t.@t.@t.u.Surname,
        Email = @t.@t.@t.u.Email
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM