[英]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.