繁体   English   中英

为什么相同的where子句需要在Linq查询中多次写入以下SQL

[英]Why Same where clause need to write multiple times in a Linq Query for following SQL

下面的SQL查询正确的linq语法是什么?

select a.id, a.AppointmentStatusID, ad.ID as DetailID
from [dbo].[Appointment] a, [dbo].[AppointmentDetail] ad
where a.[ID] = ad.[AppointmentID]
and a.CompanyID = 'a3dea87a-804e-4115-98cf-472988cf1678'
and a.LocationID = '3165caca-2a48-46f0-bbed-578cff29167t'
and ad.AppDateFrom <= {ts '2017-11-14 23:59:31'}
and ad.AppDateTo >= {ts '2017-11-14 00:00:00'}
and ad.[ApprovalStatusID] = 2

我面临的问题:

我需要在内部联接与在object.Select表达过程中第二次,请检查波纹管的时间来筛选Where条件两次 1

var results = (from a in appointments
                                   join ad in _appointmentDetailRepository.GetAll() on a.ID equals ad.AppointmentID
                                   where ad.ApprovalStatusID == 2
                                   && DbFunctions.TruncateTime(ad.AppDateFrom) <= DbFunctions.TruncateTime(viewmodel.AppointmentDate)
                                   && DbFunctions.TruncateTime(ad.AppDateTo) >= DbFunctions.TruncateTime(viewmodel.AppointmentDate)
                                   orderby a.ID
                                   select new Appointment
                                   {
                                       ID = a.ID,
                                       CompanyID = a.CompanyID,
                                       LocationID = a.LocationID,
                                       AppointmentDetail = a.AppointmentDetail.Select(ad => new AppointmentDetail
                                       {
                                           ID = ad.ID,
                                           AppDateFrom = ad.AppDateFrom,
                                           AppDateTo = ad.AppDateTo,
                                           AppointmentStatusID = ad.AppointmentStatusID,
}).Where(ad=> ad.ApprovalStatusID == 2
                                        && DbFunctions.TruncateTime(ad.AppDateFrom) <= DbFunctions.TruncateTime(viewmodel.AppointmentDate)
                                        && DbFunctions.TruncateTime(ad.AppDateTo) >= DbFunctions.TruncateTime(viewmodel.AppointmentDate)).ToList()
 }).GroupBy(x => x.ID).Select(x => x.DefaultIfEmpty().FirstOrDefault());

查询 :为什么我需要编写Where子句2次?

所需结果

约会对象->如果Details.Where条件== True,则包含ICollection<AppoinmentDetails>

从我所看到的(不知道您拥有的模型)看来,您应该使用ad已加入并已过滤的详细信息,而不是从Property a.AppointmentDetail再次a.AppointmentDetail ...

未经测试:

select new Appointment
{
    ID = a.ID,
    CompanyID = a.CompanyID,
    LocationID = a.LocationID,
    AppointmentDetail = ad.ToList(), // <-- don't you think?
    ...
}

对于给定的SQL查询

select a.id, a.AppointmentStatusID, ad.ID as DetailID
from [dbo].[Appointment] a, [dbo].[AppointmentDetail] ad
where a.[ID] = ad.[AppointmentID]
and a.CompanyID = 'a3dea87a-804e-4115-98cf-472988cf1678'
and a.LocationID = '3165caca-2a48-46f0-bbed-578cff29167t'
and ad.AppDateFrom <= {ts '2017-11-14 23:59:31'}
and ad.AppDateTo >= {ts '2017-11-14 00:00:00'}
and ad.[ApprovalStatusID] = 2

LINQ查询可以写成

var results = (from a in appointments
                       join ad in appointmentDetails on a.ID equals ad.AppointmentID
                       where ad.ApprovalStatusID == 2
                           && a.CompanyID == "a3dea87a-804e-4115-98cf-472988cf1678"
                           && a.LocationID == "3165caca-2a48-46f0-bbed-578cff29167t"
                           && ad.AppDateFrom.Date <= viewmodel.AppointmentDate.Date
                           && ad.AppDateTo.Date >= viewmodel.AppointmentDate.Date
                       select new
                       {
                           ID = a.ID,
                           AppointmentStatusID = a.AppointmentStatusID,
                           DetailID = ad.ID
                       }).ToList();

你也可以这样写

var results = appointmentDetails
                        .Where(ad => ad.AppDateFrom.Date <= viewmodel.AppointmentDate.Date
                                && ad.AppDateTo.Date >= viewmodel.AppointmentDate.Date
                                && ad.ApprovalStatusID == 2
                                && ad.Appointment.CompanyID == "a3dea87a-804e-4115-98cf-472988cf1678"
                                && ad.Appointment.LocationID == "3165caca-2a48-46f0-bbed-578cff29167t")
                        .Select(ad =>
                        new
                        {
                            ID = ad.Appointment.ID,
                            AppointmentStatusID = ad.Appointment.AppointmentStatusID,
                            DetailID = ad.ID
                        })
                        .ToList()

根据更新的问题,要获取带有AppointmentDetails集合的Appointment对象,请尝试以下查询

var results = appointmentDetails
                        .Where(ad => ad.AppDateFrom.Date <= viewmodel.AppointmentDate.Date
                                && ad.AppDateTo.Date >= viewmodel.AppointmentDate.Date
                                && ad.ApprovalStatusID == 2
                                && ad.Appointment.CompanyID == "a3dea87a-804e-4115-98cf-472988cf1678"
                                && ad.Appointment.LocationID == "3165caca-2a48-46f0-bbed-578cff29167t")
                        .Select(ad =>
                        new
                        {
                            ID = ad.Appointment.ID,
                            AppointmentStatusID = ad.Appointment.AppointmentStatusID,
                            Detail = ad
                        })
                        .AsEnumerable()
                        .GroupBy(a => new { a.ID, a.AppointmentStatusID })
                        .Select(a => new Appointment
                        {
                            ID = a.Key.ID,
                            AppointmentStatusID = a.Key.AppointmentStatusID,
                            AppointmentDetails = a.Select(d => d.Detail).ToList()
                        })
                        .ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM