スタックオーバーフロー!
私はMSSQLデータベースを持っています。このデータベースの一部は次の写真に示されています
私は、特定のevEventKindIDでイベントが発生した患者を見つけようとしている、複雑なクエリを作成しようとしています。たとえば、(evEventKindtID == 1)のイベントと(evEventKindID == 1)のイベントがある患者を検索したいと思います。
var query = from pt in db.tblPatient
select pt;
var list = query.ToList();// {1}
foreach (var limit in group.limits.Values)
{
if (limit.eventKind.Type == TypeOfEventKind.ekEvent)
{
query = from pt in query
where (pt.tblEvent.Count(j => j.evEventKindID == limit.eventKind.ID) > 0)
select pt;// {2}
list = query.ToList();
MessageBox.Show(query.Count().ToString());
}
}
問題は、次の反復ごとに前の反復よりも多くの要素が返される可能性があることです。それは私を悩ませます。クエリからのクエリは、最初のクエリよりも多くのエンティティをどのように返すことができますか?
SQL Server Profilerで、ADO.NETEFによって生成されたSQLクエリを見つけました。場所{1}:
SELECT
[Extent1].[ptID] AS [ptID],
[Extent1].[ptFullName] AS [ptFullName],
[Extent1].[ptHomeAddress] AS [ptHomeAddress],
[Extent1].[ptPhone] AS [ptPhone],
[Extent1].[ptBirthDate] AS [ptBirthDate],
[Extent1].[ptIsMale] AS [ptIsMale],
[Extent1].[ptUserID] AS [ptUserID],
[Extent1].[ptINN] AS [ptINN],
[Extent1].[ptSNILS] AS [ptSNILS]
FROM [dbo].[tblPatient] AS [Extent1]
最初の反復の場所{2}:
exec sp_executesql N'SELECT
[Project1].[ptID] AS [ptID],
[Project1].[ptFullName] AS [ptFullName],
[Project1].[ptHomeAddress] AS [ptHomeAddress],
[Project1].[ptPhone] AS [ptPhone],
[Project1].[ptBirthDate] AS [ptBirthDate],
[Project1].[ptIsMale] AS [ptIsMale],
[Project1].[ptUserID] AS [ptUserID],
[Project1].[ptINN] AS [ptINN],
[Project1].[ptSNILS] AS [ptSNILS]
FROM ( SELECT
[Extent1].[ptID] AS [ptID],
[Extent1].[ptFullName] AS [ptFullName],
[Extent1].[ptHomeAddress] AS [ptHomeAddress],
[Extent1].[ptPhone] AS [ptPhone],
[Extent1].[ptBirthDate] AS [ptBirthDate],
[Extent1].[ptIsMale] AS [ptIsMale],
[Extent1].[ptUserID] AS [ptUserID],
[Extent1].[ptINN] AS [ptINN],
[Extent1].[ptSNILS] AS [ptSNILS],
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[tblEvent] AS [Extent2]
WHERE ([Extent1].[ptID] = [Extent2].[evPatientID]) AND ([Extent2].[evEventKindID] = @p__linq__0)) AS [C1]
FROM [dbo].[tblPatient] AS [Extent1]
) AS [Project1]
WHERE [Project1].[C1] > 0',N'@p__linq__0 int',@p__linq__0=29
そして、2回目の反復の{2}の場所:
exec sp_executesql N'SELECT
[Project2].[ptID] AS [ptID],
[Project2].[ptFullName] AS [ptFullName],
[Project2].[ptHomeAddress] AS [ptHomeAddress],
[Project2].[ptPhone] AS [ptPhone],
[Project2].[ptBirthDate] AS [ptBirthDate],
[Project2].[ptIsMale] AS [ptIsMale],
[Project2].[ptUserID] AS [ptUserID],
[Project2].[ptINN] AS [ptINN],
[Project2].[ptSNILS] AS [ptSNILS]
FROM ( SELECT
[Project1].[ptID] AS [ptID],
[Project1].[ptFullName] AS [ptFullName],
[Project1].[ptHomeAddress] AS [ptHomeAddress],
[Project1].[ptPhone] AS [ptPhone],
[Project1].[ptBirthDate] AS [ptBirthDate],
[Project1].[ptIsMale] AS [ptIsMale],
[Project1].[ptUserID] AS [ptUserID],
[Project1].[ptINN] AS [ptINN],
[Project1].[ptSNILS] AS [ptSNILS],
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[tblEvent] AS [Extent3]
WHERE ([Project1].[ptID] = [Extent3].[evPatientID]) AND ([Extent3].[evEventKindID] = @p__linq__1)) AS [C1]
FROM ( SELECT
[Extent1].[ptID] AS [ptID],
[Extent1].[ptFullName] AS [ptFullName],
[Extent1].[ptHomeAddress] AS [ptHomeAddress],
[Extent1].[ptPhone] AS [ptPhone],
[Extent1].[ptBirthDate] AS [ptBirthDate],
[Extent1].[ptIsMale] AS [ptIsMale],
[Extent1].[ptUserID] AS [ptUserID],
[Extent1].[ptINN] AS [ptINN],
[Extent1].[ptSNILS] AS [ptSNILS],
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[tblEvent] AS [Extent2]
WHERE ([Extent1].[ptID] = [Extent2].[evPatientID]) AND ([Extent2].[evEventKindID] = @p__linq__0)) AS [C1]
FROM [dbo].[tblPatient] AS [Extent1]
) AS [Project1]
WHERE [Project1].[C1] > 0
) AS [Project2]
WHERE [Project2].[C1] > 0',N'@p__linq__0 int,@p__linq__1 int',@p__linq__0=31,@p__linq__1=31
この問題についてどう思いますか?