2

以下の2つの機能的に同一のクエリ、SQLバージョンとラムダバージョンを参照してください。

from a in Lines.AsEnumerable()
where a.LineId == SomeGuid
select a

-

Lines.AsEnumerable()
.Where(a => a.LineId == SomeGuid)
.Select(a => a)

両方のクエリは、WHEREステートメントを持たないSQLに変換されます。

SELECT * FROM Line 

ラムダでは、Where句の後にAsEnumerableを配置すると、結果のSQLにWHERE句が含まれるので便利です。したがって、ラムダクエリは次のようになります。

Lines
.Where(a => a.LineId == SomeGuid)
.AsEnumerable()
.Select(a => a)

結果のSQLはSELECT*FROM Line WHERE LineId=@paramです。

質問: Linq SQL構文を使用してこれを行うにはどうすればよいですか?つまり、結果のSQLステートメントにWHERE句を含めたいと思います。テーブルLineからすべてのレコードをプルすることは避けたいです。AsEnumerableをクエリ内のさまざまな場所に配置しようとしましたが、機能させることができませんでした。

編集:
単純なステートメントでは、最後にAsEnumerableを配置することは機能しますが、射影を使用する場合、EFは文句を言います(サポートされていない例外:複合型を構築できません...)

 (from a in Lines
    where a.LineId == SomeGuid
    select new Line
    {
        LineId = a.LineId
    }).AsEnumerable()

動作しません

4

1 に答える 1

4

これを行うだけです:

var query (from a in context.Lines
           where a.LineId == SomeGuid
           select a).AsEnumerable();

しかし、ほとんどの場合、これは必要ありません。クエリを列挙可能にしますが、クエリは実行しません。クエリは反復時にのみ実行されます。

ところで。.Select(a => a)あなたの例では自動的に起こるので必要ありません。

編集:

AsEnumerableLinq-to-entities は、マップされた型への射影を禁止しているため、先に述べたように、最初に匿名型に射影し、呼び出して、実際のマップされた型に射影する必要があるとコメントしています。

var query =  (from a in Lines
              where a.LineId == SomeGuid
              select new {
                  LineId = a.LineId
              }).AsEnumerable()
              .Select(a => new Line { LineId = a.LineId });

a.LineIdこの場合、直接選択できるため、匿名型は必要ありません。

于 2012-08-13T19:17:45.883 に答える