2017-06-05 18 views
0

で結合されたテーブルの上にはどこを達成するために、私持っている私のデータベースに次の2つのテーブル:がどのようにEntity Frameworkを

[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を達成したいです、 Entity FrameworkのLINQとメソッドを使用して除い:

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

は私が結合を作成する方法を知って、私のマッピングを使用して、そうcreati結合は問題ではありません。私はまた、私は問題ではないので、私は必要な日付機能を行う方法を知っています。私は(LINQのメソッドを使用して)実行する方法を知っておく必要があり

言う部分:where Schedule.Time < SOMETHING

は、ここで私が試したものだが、それは誤り投げた:それは私を与えた

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

エラーを「Includeパス式は、そのタイプで定義されているナビゲーションプロパティを参照する必要があります。

Entity Frameworkでlinqメソッドを使用すると、SQLのように結合テーブルで「Where」をどのように達成できますか?

context.Patients.Where(x => x.Schedules.Time == DateTime.Now);Patient.Schedulesは1対多の関係であるため、Patient.Schedulesはコレクションなので、私はできません。

答えて

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)); 
+0

うわー、それは素晴らしいことです!なんらかの理由で、クエリをスワップして、スケジュールから開始するクエリは発生しませんでした。素晴らしい答え! –

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} 
0

まずように、あなたのクエリ内のGetDate()を行うことが賢明である場合IQueryableは私が考えるほど、私は、よく分かりませんそれはうまくいきません。IEnumerableとして、列挙中に何回呼び出されるかわかりません。

まず、使用するスケジュールをフィルタリングしてから、結合を実行します。小さなステップで

:もちろん

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を除く)1つのステートメントでこれを置くことができ

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