2

この機能的なLinq-to-Sqlステートメントがあります。

public IEnumerable<int> GetChildIds(IEnumerable<int> selectedParentIds)
{
    using (var context = new MyContext())
    {
        return context.Children
            .Where(c => selectedParentIds.Contains(c.parentId))
            .Select(c => c.Id)
            .ToList();
    }
}

要求に応じて、選択した子IDが表示されますが、SQLプロファイラーを実行しています。

このステートメントは、データベースに個別の要求を送信してselectedParentIdいるように見えますが、これは私には最適ではないと思われます。

サーバーとのトラフィックを最小限に抑えるために、このステートメントを再構築する方法はありますか?私が取るべき別のアプローチはありますか、それともこれはそれが得るのと同じくらい良いですか?

編集

指導ありがとうございます。

これは私のトレース出力の解釈の誤りです。Linq-To-SQLは、SQLServer 2008の場合と同じように、SQLServer2005に対して完全に合理的なステートメントを作成します。問題は他の場所にあります。

4

3 に答える 3

1

SQL 2008 に対して LINQ to SQL を使用した同じクエリでは、単一の SQL クエリが生成されます。SQL Server 2008 に対してテストできますか?

例えば:

IEnumerable<int> list = new List<int>{1,2,3};

Models.Where (m => list.Contains(m.Id)).Select (m => m.Id).ToList();

プロデュース

-- Region Parameters
DECLARE @p0 Int = 1
DECLARE @p1 Int = 2
DECLARE @p2 Int = 3
-- EndRegion
SELECT [t0].[Id]
FROM [Models] AS [t0]
WHERE [t0].[Id] IN (@p0, @p1, @p2)

そして、Entity Frameworkを使用しても同じことが生成されます

SELECT 
[Extent1].[Id] AS [Id]
FROM [dbo].[Models] AS [Extent1]
WHERE [Extent1].[Id] IN (1,2,3)

したがって、これを SQL 2005 と照合することができないので、危険を冒して、サーバーをアップグレードしない限り何もできないと言うつもりです。

于 2012-04-27T16:50:40.657 に答える
1

これは何か違うものを生み出しますか?

public IEnumerable<int> GetChildIds(IEnumerable<int> selectedParentIds)
{
using (var context = new MyContext())
{
    return context.Children
        .Where(c => selectedParentIds.Any( p => p == c.parentId ))
        .Select(c => c.Id)
        .ToList();
}
}
于 2012-04-27T16:52:53.240 に答える
0

異なるバージョンの SQL Server に対して異なる出力が得られる場合は、いつでも次のようなことを試すことができます

public IEnumerable<int> GetChildIds(IEnumerable<int> selectedParentIds)
{
    using (var context = new MyContext())
    {
        var query = context.Children;
        foreach (var id in selectedParentIds)
        {
            query = query.Where(q => q.parentId == id);
        }

        return query.Select(q => q.Id)
                    .ToList();
    }
}

これをテストするための SQL Server 2005 のインスタンスはもうありません (互換モードを使用する SQL Server 2008 R2 は、最初のコードであっても単一のクエリを生成します)。使用している SQL Server の

于 2012-04-27T17:20:22.587 に答える