親がnull、つまりすべてのルートモジュールを意味するすべてのモジュールを取得したい。
さらに、すべてのモジュールが子を持っているかどうかを知っている必要があります。
ルート モジュールが遅延ロードされたモジュール ツリーに表示されるため、この機能が必要です。
そうすれば、SQLですばやく機能しました。
SELECT
Id,
CASE WHEN EXISTS (SELECT NULL FROM Module m2 WHERE m2.ParentId = module.Id) THEN 1
ELSE 0
END AS HasChildren
FROM Module
WHERE ParentId IS NULL
EF 5 を使用して同じことを行うにはどうすればよいですか?
アップデート
これらは、最初に EF コードを使用する私の Poco である私のクラスです。
public class Module
{
public Module()
{
Children = new List<Module>();
}
// PK
public int ModuleId { get; set; }
public string Name { get; set; }
public List<Module> Children { get; set; }
// FK
public int MachineId { get; set; }
public Machine Machine { get; set; }
}
public class Machine
{
// PK
public int MachineId { get; set; }
public string Name { get; set; }
}
更新2
@ゲルト
これは、ソリューション .Any() コード用に EF によって生成された SQL です。
{SELECT
[Extent1].[ModuleId] AS [ModuleId],
[Extent1].[Name] AS [Name],
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Module] AS [Extent2]
WHERE [Extent1].[ModuleId] = [Extent2].[Module_ModuleId]
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Module] AS [Extent3]
WHERE [Extent1].[ModuleId] = [Extent3].[Module_ModuleId]
)) THEN cast(0 as bit) END AS [C1]
FROM [dbo].[Module] AS [Extent1]
WHERE ([Extent1].[ParentId] IS NULL) AND ([Extent1].[MachineId] = @p__linq__0)}
以前のクエリが異なって見えるため、linq クエリは HasChildren プロパティに対して TRUE を返しません。
context.Modules.SqlQuery("SELECT Module.ModuleId, Module.Name, case when Exists(select null from Module m where m.ParentID = Module.ModuleId) " +
"then 1 else 0 end as HasChildren FROM Module WHERE Module.ParentId Is Null AND Module.MachineId = @MachineId ORDER BY HierarchyIndex",
new SqlParameter("MachineId",machineId)).ToList();
EF によって生成された「あなたの」SQL ステートメントでは、重要な m.ParentId = Module.ModuleId の比較を見逃しています。Extend1.ModuleId = Extend2.Module_ModuleId を実行します。
何か問題があるようです。