0

私は2つのテーブルを持っていて PatientEncounterDemoPatientMaster

PatientEncounterDemo:

PateientID(F.K int),
DoctorId( F.K int),
ProcedureName



PatientMaster:

PatientId(P.K identity)
PatientFirstName(varchar(50)),
PatientLastName(varchar(50)),
PatientDOB

私は、PatientName(patientFirstName_+patientLastName)、patientDOB、および特定の患者に割り当てられた手順の数を抽出する必要があります (患者には多くの手順が割り当てられている可能性があります)。

その結果の SQL クエリを次のように記述しました。

//This puts the join inside count-

select distinct  PatientFirstName+ ' ' + PatientLastName as PatientName,PatientDOB,COUNT(ProcedureName) as [Proc Count] from
(
select distinct  p.PatientFirstName,p.PatientLastName,p.PatientDOB,e.ProcedureName
from PatientMaster p,PatientEncounterDemo e 
where p.PatientId=e.PatientId and e.DoctorId=1
)as mytable group by PatientFirstName,PatientLastName,PatientDOB

しかし、私はlinqクエリを介してそれを行うのに苦労しています.何らかの方法を提案してください..!!

4

4 に答える 4

2

これは、SQL から LINQ への (ほぼ) 1 対 1 のマッピングになります。

var myTable = (
    from encounter in db.PatientEncounterDemos
    where encounter.Doctor.Id == 1
    let patient = encounter.Patient
    select    new 
    {
        patient.FirstName, 
        patient.LastName,         
        patient.DOB,
        encounter.ProcedureName
    })
    .Distinct();

var results =
    from item in myTable
    group item by new { item.FirstName, item.LastName, item.DOB } into g
    select new 
    { 
        PatientName = g.Key.FirstName + " " + g.Key.LastName, 
        g.Key.DOB, 
        ProcCount = g.Count() 
    };

しかし、これは従う方が簡単です:

var myTable = (
    from encounter in db.PatientEncounterDemos
    where encounter.Doctor.Id == 1
    select new { encounter.Patient, encounter.ProcedureName })
    .Distinct();

var results =
    from item in myTable
    group item by item into g
    select new 
    { 
        PatientName =
            g.Key.Patient.FirstName + " " + g.Key.Patient.LastName, 
        g.Key.DOB, 
        ProcCount = g.Count() 
    };
于 2012-10-10T11:29:47.713 に答える
1

うまくいけば、これはあなたが求めているものを達成するはずです:

var patientProcedureCounts =
    from master in PatientMasters
    select new
    {
        master.PatientId,
        PatientName = master.PatientFirstName + " " +
            master.PatientLastName,
        master.PatientDOB,
        ProcedureCount = (from demo in PatientEncounterDemos 
            where demo.PatientId == master.PatientId &&
                demo.DoctorId == 1 
            select 1).Count()
    };

これによりすべてが選択されPatientMasters、次におよび ですべてPatientEncounterDemosが選択されます。最後に、マスター詳細とその患者のデモの数を使用して、次のように列挙できる新しい匿名型を構築します。PatientIdDoctorId

foreach(var procedureInfo in patientProcedureCounts)
{
    Console.WriteLine("Patient {0} born on {1} had {2} procedures", 
        procedureInfo.PatientName, procedureInfo.PatientDOB, procedureInfo.ProcedureCount);
}

以下は、LINQPad によって生成された SQL であり、目的に十分近いように見えます。

-- Region Parameters
DECLARE @p0 NVarChar(1000) SET @p0 = ' '
DECLARE @p1 Int SET @p1 = 1
-- EndRegion
SELECT [t0].[PatientId], ([t0].[PatientFirstName] + @p0) + [t0].[PatientLastName] AS [PatientName], [t0].[PatientDOB], (
    SELECT COUNT(*)
    FROM [PatientEncounterDemo] AS [t1]
    WHERE ([t1].[PatientId] = [t0].[PatientId]) AND ([t1].[DoctorId] = @p1)
    ) AS [ProcedureCount]
FROM [PatientMaster] AS [t0]
于 2012-10-10T11:28:16.483 に答える
0

最後に、すべての回答のサポートにより、このクエリで正確な結果が得られました。

最初に、データベースの where 条件とともに内部結合が実行されます。

次に、複数の列をたどって結果をグループ化し、そのグループでカウントを実行しました。

私のLinqクエリ:

 var myTable = (
          from master in MyDataContext.PatientMasters
          join encounter in MyDataContext.PatientEncounterDemos
          on master.PatientId equals encounter.PatientId
          where encounter.DoctorId == doctorID
          select new { master.PatientFirstName, master.PatientLastName, master.PatientDOB, encounter.ProcedureName })
          .Distinct();

      var results =
          from item in myTable
          group item by new { item.PatientFirstName, item.PatientLastName, item.PatientDOB } into grp
          select new
          {
              PatientName =
                  grp.Key.PatientFirstName + " " + grp.Key.PatientLastName,
              grp.Key.PatientDOB,
              ProcCount = grp.Count()
          };

そして今、Foreachループを適用して結果をリストに取得しました..!! ありがとうございます...!!!!

于 2012-10-10T14:30:55.370 に答える
0

私はあなたのSQLを書き直しました(うまくいくはずです)。これにより、LINQ を簡単に作成できるはずです。

SELECT 
    p.PatientFirstName + ' ' + p.PatientLastName as PatientName
    p.PatientDOB,
    COUNT(e.ProcudureName) AS [Proc Count]
FROM 
    PatientMaster p
    INNER JOIN PatientEncounterDemo e ON p.PatientId = e.PatientId
WHERE
    e.DoctorId=1
GROUP BY
    p.PatientFirstName,
    p.PatientLastName,
    p.PatientDOB
于 2012-10-10T11:21:56.797 に答える