如何使用Entity Framework在已连接的表上完成Where

时间:2017-06-05 21:29:44

标签: c# entity-framework linq

我的数据库中有以下两个表:

[Schedule](
    [Time] [datetime] NULL,
    [ScheduleID] [bigint] IDENTITY(1,1) NOT NULL,
    [PatientID] [varchar](20) NULL,
 CONSTRAINT [PK_Schedule] PRIMARY KEY CLUSTERED 
(
    [ScheduleID] ASC
)

[Patient](
    [NameLast] [varchar](20) NOT NULL,
    [NameMiddle] [varchar](20) NULL,
    [NameFirst] [varchar](20) NOT NULL,
    [DOB] [varchar](20) NULL,
    [PatientID] [varchar](20) NOT NULL,
 CONSTRAINT [PK_Patient] PRIMARY KEY CLUSTERED 
(
    [PatientID] ASC
)

我想完成以下SQL,除了在实体框架中使用linq方法:

select NameFirst, NameLast, DOB
from Patient
join Schedule on Schedule.PatientID = Patient.PatientID
where Schedule.Time < GETDATE()

我知道如何使用我的映射创建连接,因此创建连接不是问题。我也知道如何做我需要的日期功能,这不是问题。

我需要知道如何完成(使用linq方法)部分说:where Schedule.Time < SOMETHING

这是我尝试过的,但它引发了一个错误:

var patients = context.Patient
    .Include(x =>
        x.Schedule.Where(y => y.Time < DateTime.Now)
    );

它给我的错误是:“Include路径表达式必须引用在类型上定义的导航属性。”

那么,我如何使用实体框架中的linq方法在连接表上完成“Where”,就像在SQL中一样?

我无法context.Patients.Where(x => x.Schedules.Time == DateTime.Now);因为Patient.Schedules是一个集合,因为这是一对多的关系。

3 个答案:

答案 0 :(得分:2)

这样的东西
context.Schedule.Where(y => y.Time < DateTime.Now).Select( s => s.Patient);

context.Patient.Where( p => p.Schedules.Any( s => s.Time < DateTime.Now) );

答案 1 :(得分:1)

from t1 in db.Patient 
join t2 in db.Schedule on 
t1.PatientId equals t2.PatientId 
where t2.Time<getTime 
select new { t1.NameFirst, t1.NameLast, t1.DOB}

答案 2 :(得分:0)

首先,我不确定在查询中执行GetDate()是否明智,因为IQueryable我认为它不起作用,而IEnumerable我是{I}不确定在枚举期间调用它的次数。

您可以先过滤要使用的计划,然后再进行加入。

小步骤:

DateTime myDate = GetDate();
var oldSchedules = dbCntext.Schedules.Where(schedule => schedule.Time < myDate);

var requiredResult = dbContext.Patients  // join Patients
    .join(oldSchedules,                  // with the old schedules
    patient => patient.PatientID,        // from patients take PatientID
    schedule => schedule.PatientID<      // from old schedules that PatientID
    (patient, schedule) => new           // when they match, take the recods
    {                                    // to create a new Anonymous type
        NameFirst = patient.NameFirst,   // with the required properties 
        NameLast = patient.NameLast,
        Dob = patient.Dob,
    });

当然你可以把它放在一个声明中(GetDate()除外)

DateTime myDate = GetDate();
var result = dbContext.Schedules
    .Where(schedule => schedule.Time < myDate)
    .Join(dbContext.Patients,
    schedule => schedule.PatientId,
    patient => patient.PatientId,
    (schedule, patient) => new
    {
        ...
    });