0

「プロジェクト」、「プラットフォーム」、「詳細」という 3 つのテーブルがあります。

Projects テーブル、Platforms テーブル、Details テーブルから詳細を収集しました。詳細テーブルから、複数の値または単一の値を取得できます。

以下のようなLinqクエリを書きました:

using (PEntities CSProject = new PEntities())
{
    projectId =    (from _project in CSProject.Projects
                    where _project.ProjectName == project
                    select _project.ProjectId).SingleOrDefault();

    platformId =   (from platformID in CSProject.Projects
                    where platformID.ProjectName == project
                    select platformID.PlatformId).SingleOrDefault();

    platformName = (from platfrmName in CSProject.Platforms
                    where platfrmName.PlatformId == platformId
                    select platfrmName.PlatformName).SingleOrDefault();

    cSProjectId =  (from _csproject in CSProject.Details
                    where _csproject.ProjectId == projectId
                    select _csproject.CsprojectId).ToList<long?>();
}

上記のすべてのクエリを 1 行で書くのを手伝ってくれませんか?

4

1 に答える 1

0

次のように、ステートメントで取得する値ごとに相関サブクエリを作成できます(SQL の場合)。select

select
    (select ProjectId from Projects where ProjectName = @project) as ProjectId,
    (select PlatformId from Projects where ProjectName = @project) as PlatformId,
    ...

SQLでは、上記はクエリを実行するテーブルを必要としません(1行を返します)が、LINQ-to-Entitiesに何かが必要になります。これにより、コンテキストに対してクエリを実行する必要があります。テーブル内の少なくとも 1 つの値など。

言うまでもなく、それだけの価値はありません。データベースへの呼び出しは少なくなりますが、送信される実際のクエリは非常に複雑になります。

とはいえ、次の 2 つのいずれかを行う方がよいでしょう。1 つ目は、相関サブクエリを作成し、上記のように 1 つのレコードを返し、それを LINQ-to-Entities から呼び出すストアド プロシージャを作成することです。

もう 1 つは、これらの値を格納する 1 つのレコードを実際に探している場合は、型に格納することです。匿名型でそれを行う方法は次のとおりです。

using (PEntities CSProject = new PEntities())
{
    var results = new {
        ProjectId = (
            from _project in CSProject.Projects
            where _project.ProjectName == project
            select _project.ProjectId).SingleOrDefault(),

        PlatformId = (
            from platformID in CSProject.Projects
            where platformID.ProjectName == project
            select platformID.PlatformId).SingleOrDefault(),

        PlatformName = (
            from platfrmName in CSProject.Platforms
            where platfrmName.PlatformId == platformId
            select platfrmName.PlatformName).SingleOrDefault();

        CsProjectId = (
            from _csproject in CSProject.Details
            where _csproject.ProjectId == projectId
            select _csproject.CsprojectId).ToList<long?>();
    };
}

データベースへの呼び出しの減少は見られませんが、目的がこれらの値を持つ単一のレコードである場合、これは達成されます。

于 2012-10-14T15:40:15.640 に答える