2009-04-15 32 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

好吧,我看到發生了什麼有 我怎樣才能解決這個獲得理想的情況下,我想?爲了能夠在'territories'上調用'.Where',那麼我需要做些什麼才能讓db.Territories返回一個IQueryable? – 2009-04-15 15:09:39

+0

爲什麼你要爲db.Territories指定一個值?你想發佈一個更新回表格?如果沒有,將需要一個單獨的變量來分配您的linq表達式... – flatline 2009-04-15 15:15:41

0

因爲您已將「var」輸入爲表<Territory>,然後嘗試將其重新分配爲IQueryable <Territory>。

這相當於說

var i = 0 

    i = "a string"; 

編輯:爲了澄清,VAR是在編譯時隱式強類型不運行時,不像動態類型的腳本語言。

1

var territories最初類型爲System.Data.Linq.Table<Territory>,然後你想分配Where條款(其類型爲System.Linq.IQueryable<Territory>),以它的結果。

請記住,編譯器會在賦值時推斷var的類型,因此一旦賦值,類型將無法更改。

嘗試這樣:

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

您需要使用的IQueryable tyupe如其他人所說:

也是這個LINQ查詢也許也行:

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

對於這種類型的累積Where,您需要告訴編譯器使用IQueryable<T>

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

這不會工作,因爲「db.Territories」是表格本身。 – 2009-04-15 15:11:47

+0

沒有問題分配它。剛剛嘗試過。 – 2009-04-15 15:15:54

+0

我的錯誤,你是對的!表格實現IQueryable so(+1)給你。 :) – 2009-04-15 15:20:34

0

聲明後,您無法將var重新分配給其他類型。所以你的var聲明已經將它輸入到System.Data.Linq.Table。

這是一次火災。

2

關於「var」的一個潛在令人困惑的事情是它的類型是在編譯時確定的,所以你不能爲它分配一系列不同的類型。有動態語言經驗的人,比如Python,起初有時會被這個困惑。

+0

是的,我來自Ruby,所以我認爲這是我困惑的地方。 – 2009-04-15 15:15:00

3

改變這種

var territories = db.Territories; 

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

的原因是通過調用db.Territories,你所得到的所有數據傳回,在linq.table對象返回它。 Db.Territores.where(...會返回一個IQueryable對象,而不是

+0

但現在你必須弄清楚類型,不好。 – leppie 2009-04-15 15:18:04