2009-04-15 13 views
4

私はLinqToSQLに自分自身を最近、仕事場でうまく作られていないプロジェクトを通して紹介してきました。私はこの作品理由として興味:基本的なLinqToSqlの質問:これはなぜコンパイルされませんか?

var territories = db.Territories.Where(t => t.PendingUserCount > 0); 

しかし、これはコンパイルエラーが発生:

var territories = db.Territories; 
if (someCondition) 
    territories = territories.Where(t => t.PendingUserCount > 0); 
// Cannot implicitly convert 'System.Linq.IQueryable<Territory> to System.Data.Linq.Table<Territory> 

私もdb.Territories.ToList()を呼び出そうとしましたが、無駄にしました。

私はそれがLinqの仕組みについての誤解であると確信していますが、誰かが私を助けることができれば感謝しています。

答えて

5

代替:。

var territories = db.Territories.AsQueryable(); 
if (someCondition) 
    territories = territories.Where(t => t.PendingUserCount > 0); 
8

db.Territoriesはテーブルオブジェクトを返します。したがって、 'var'はSystem.Data.Linq.Table型になります。後で、何らかの条件に基づいて、System.Linq.IQueryable型のものを変数に代入しようとします。 .NETは強く型付けされるので、コンパイラはエラーをスローします。

var型の変数には、最初に割り当てられるときに型が割り当てられます。それは私が自分自身を覚えようとする方法です。

+0

さて、私はそこに何が起こっているか見 がどのように私は理想的には私が好きなこの問題を回避することができます。? dbTerritoriesはIQueryableを返すために何をしなければならないのですか? –

+0

なぜdb.Territoriesに値を代入しようとしていますか?テーブルに戻って更新しますか?そうでない場合は、linq式を割り当てる別の変数が必要になります... – flatline

0

テーブル<Territoryとして「var」を入力してから、それをIQueryable <Territory>として再割り当てしようとしているためです。

これは

var i = 0 

    i = "a string"; 

EDIT言うと同等です:明確にするために、VARは、コンパイル時に動的型付けのスクリプト言語とは異なり、時間を実行しないで、暗黙的に強く型付けされています。

1

あなたvar territoriesは最初System.Data.Linq.Table<Territory>として入力され、その後、あなたはそれに(タイプSystem.Linq.IQueryable<Territory>である)Where節の結果を割り当てようとしています。

コンパイラは代入時にvarの型を推定するので、代入後は型を変更できないことに注意してください。また、このLINQクエリは、多分また働く

を::このタイプの

var query = from territories in db.Territories 
      where territories.SomeProperty == SomeCondition 
      where territories.PendingUserCount > 0 
      select territories; 
0

が示唆されている:

はこのような何かを試してみてください累積Whereのうち、IQueryable<T>を使用するようにコンパイラに指示する必要があります。

IQueryable<Territory> territories = db.Territories; 
if (someCondition) 
    territories = territories.Where(t => t.PendingUserCount > 0); 
... etc 
7

をあなたが他の人とのIQueryable tyupeを使用する必要が

System.Linq.IQueryable<Territory> territories; 
if (someCondition) 
    territories = db.Territories.Where(t => t.PendingUserCount > 0); 
+0

"db.Territories"がテーブルそのものとして機能しません –

+0

それを割り当てるのに問題はありません。ただ試みた。 –

+0

私の間違い、あなたは正しいです!テーブルはあなたにIQueryable を実装します(+1)。 :) –

0

varを宣言した後で別の型に再割り当てすることはできません。だからあなたのvar宣言はすでにSystem.Data.Linq.Tableにそれをタイプしています。

火災です。

2

「var」について潜在的に混乱するものの1つは、その型がコンパイル時に決定されるため、異なる型の範囲を割り当てることができないことです。 Pythonのような動的言語の経験を持つ人は、最初はこれで混乱することがあります。この

var territories = db.Territories; 

IQueryable territories = db.Territories.Where(t => t.PendingUserCount > 0); 

への推論に

+0

うん、私はルビーから来ているので、私はそれが私が混乱していると思う。 –

3

変更はdb.Territoriesを呼び出すことによって、あなたはlinq.tableオブジェクトでそれを返して、戻ってすべてのデータを取得しているということです。 Db.Territores.where(...代わりのIQueryableオブジェクトを返します

+0

しかし、あなたはそのタイプを理解しなければなりません。 – leppie