2012-01-02 6 views
0

linq joinを理解するのに助けが必要です。私はこの問題に関連したいくつかの話題を見つけましたが、私はステップの良い説明を見つけませんでした。linqでエンティティフレームワークに参加する

私はこれを通常のクエリです。

var q = from c in context.tableA 
     select c; 
     List<tableA> tableAList = q.ToList(); 

q.ToList()は、クエリを実行します。この例から、私はそのクエリが1以上objetcを持つことができますが、これについて何が「新しいを選択する」を参照してくださいすることができますので、

hereは、いくつかの例を見つけましたが、私はこのことについて明確にしたい、

using (AdventureWorksEntities context = new AdventureWorksEntities()) 
{ 
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders; 
ObjectSet<SalesOrderDetail> details = context.SalesOrderDetails; 

var query = 
    from order in orders 
    join detail in details 
    on order.SalesOrderID equals detail.SalesOrderID 
    where order.OnlineOrderFlag == true 
    && order.OrderDate.Month == 8 
    select new 
    { 
     SalesOrderID = order.SalesOrderID, 
     SalesOrderDetailID = detail.SalesOrderDetailID, 
     OrderDate = order.OrderDate, 
     ProductID = detail.ProductID 
    }; 

foreach (var order in query) 
{ 
    Console.WriteLine("{0}\t{1}\t{2:d}\t{3}", 
     order.SalesOrderID, 
     order.SalesOrderDetailID, 
     order.OrderDate, 
     order.ProductID); 
} 
} 

? DBの各レコードに対して呼び出されますか?

そのオブジェクトはどのような種類ですか?クエリの最初のテーブルがあるので誰かが欲しい、または注文していますか?

オブジェクトが最初のテーブルの場合、このタイプで定義されていないデータが必要な場合、新しいattrを意味します。

他の質問、クエリはいつ実行されますか?

また、この方法は応答速度に適していますか、それともより良い解決策ですか?

thxです。この答えがあるスレッドがある場合、plzは私をよく指します。

答えて

2

in q.ToList() its get executed the query, right?

はい

what about this "select new" ? is it called for each record in the DB ?

新しいクエリが正常にあなたのテーブルに対して実行され、ちょうど新しい匿名のオブジェクトです。

what type is that object? anyone i want or is order because is the first table in the query?

それはあなたが定義されたOrderクラスを持っている場合は、しかしselect new Order {を行うことができ、匿名のです。

in case of the object is the first table, what happens if i need to have data that is not defined in this type of, i mean new attr.

オブジェクト/クラスに属性/プロパティを追加または追加する必要があります。 foreachループ

also, is this method good for response speed or are better solutions?

other question, when is the query executed?

はい、それは

+0

私に言ったことは正しいです。今私は例に誤りを得る。 ONのステートメントでは、注文と詳細は等価で正しいのではなく、どこで正しいステートメントであると言われています。どんな手掛かり? –

+0

エラー: "order"という名前が 'equals'の左側の領域にありません。 'equals'の両辺の式を変更します。 –

+0

誰かが気にしていれば、その問題はここで重要です。私は、平等の左に詳細を入れて、右に行く必要があります。 –

1

Select new大丈夫です匿名型を作成している、あなたは、両方のテーブルからそれに望むものは何でもフィールドに置くことができます。あなたは(foreachの)を反復処理するとき
http://msdn.microsoft.com/en-us/library/bb397696.aspx

あなたはそれの結果を使用するたびにクエリが実行され

が、それはそれの上に起こることができるか、あなたはToListメソッド()、内のtoArrayを呼び出すたび:
あなたは、いくつかは、ここでそれについて読んで行うことができます()またはその上の何でも。

この方法は、応答速度がかなり良い方法です。 生成されたSQLと同様に、おそらくあなたのユースケースに合わせて最適化することができますが、本当に膨大な量のデータがない限り、それだけで十分です。 それ以外の場合は、ストアドプロシージャを作成し、Entity Frameworkにマップする必要があります。

関連する問題