私は現在、linq2sql をデータベース アクセス フレームワークとして使用するプロジェクトに取り組まなければなりません。現在、基本的に次のことを行う多くの linq クエリがあります。
var result = from <some_table>
join <some_other_table>
join <another_table>
select <some_other_domain_model> // This is a non linq2SQL poco
return result.Where(<Some_Predicate>);
たとえば、3 つのテーブルを読み取り、コンテンツを 1 つの大きな上位モデルに照合して、ビューに送信するとします。ここで、ドメインの混合を無視します。それはあまり気にしないので、最終的な where 句です。
今、私はLinq2Sqlをあまり使用したことがないので、何が起こるかは次のように言うのが正しいでしょうか:
- from、join、join、select linq に基づいて SQL を生成する
- すべての行を取得する
- このすべてのデータを 1 つの大きなモデル (メモリ内) にマップする
- すべてのモデルをループし、該当するモデルのみを返します
これが私の質問の核心であるため、上記のフローが発生するかどうかは私の心の中では理にかなっていますが、4番目のステップよりもフレームワークをよく知っている人々によって議論されており、何らかの形でSQLに組み込まれています世代なので、すべてのレコードを引き戻すわけではありませんが、これを設定するためにすべてのデータを前もって必要とするため、どのようにそれを行うことができるかわかりません。行はすべて読み取られ、すでにメモリー内にあります。
データベース レベルで不要なレコードを除外するために、where 句を linq に移動するようにプッシュしようとしていますが、上記の仮定が正しいかどうかについて誰かがアドバイスできるかどうか疑問に思っていました。
== 編集 ==
これは linq2sql によって生成されたオブジェクトではなく、他の場所で転がされたランダムな poco ハンドであるという事実に注意を向けるためにコメントを追加しました。質問は LESS about"does it matter where I put the where clause"
であり、詳細について"Does the where clause still get factored into the underlying query when it is applied to a non linq2sql object generated from a linq2sql query"
です。
これは、私の理解の欠如がどこにあるのかをより強調することを願って、私が意味することの別のより簡潔な例です:
/*
I am only going to put auto properties into the linq2sql entities,
although in the real world they would be a mix of private backing
fields with public properties doing the notiftying.
*/
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.some_table_1")]
public class SomeLinq2SqlTable1
{
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="some_table_1_id", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int Id {get;set;}
}
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.some_table_2")]
public class SomeLinq2SqlTable2
{
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="some_table_2_id", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
public int Id {get;set;}
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="some_table_2_name", AutoSync=AutoSync.OnInsert, DbType="Varchar NOT NULL", IsPrimaryKey=false)]
public string Name {get;set;}
}
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.some_table_3")]
public class SomeLinq2SqlTable3
{
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="some_table_3_id", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
public int Id {get;set;}
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="some_table_3_other", AutoSync=AutoSync.OnInsert, DbType="Varchar NOT NULL", IsPrimaryKey=false)]
public string Other {get;set;}
}
/*
This is some hand rolled Poco, has NOTHING to do with Linq2Sql, think of it as
a view model of sorts.
*/
public class SomeViewModel
{
public int Id {get;set;}
public string Name {get;set;}
public string Other {get;set;}
}
/*
Here is psudo query to join all tables, then populate the
viewmodel item from the query and finally do a where clause
on the viewmodel objects.
*/
var result = from // Linq2SqlTable1 as t1
join // Linq2SqlTable2.id on Linq2SqlTable1.id as t2
join // Linq2SqlTable3.id on Linq2SqlTable1.id as t3
select new ViewModel { Id = t1.Id, Name = t2.Name, Other = t3.Other }
return result.Where(viewModel => viewModel.Name.Contains("some-guff"));
上記の例では、最終的な Where ステートメントは基になるクエリに組み込まれるのでしょうか、それとも viewModel の where によって検索が行われ、メモリ内で評価されるのでしょうか?
この質問が冗長で申し訳ありませんが、それに関するドキュメントはほとんどなく、これは非常に具体的な質問です。