2013-05-15 66 views
8

我從來沒有見過這個錯誤之前和它非常混亂,我基本上是試圖做一些事情,我說找我的所有位置(將只返回一個)相匹配的位置名稱中通過了與類型:非靜態方法需要一個目標?

string name = columns[40]; 
Location type = db.Locations.Where(l => l.name == name).FirstOrDefault(); 
Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault(); 

可能有更好的方法來做我想要的東西,但基本上我從列中獲取名稱(這來自csv文件),然後說,讓我知道位置信息。在此之後,我現在說好了,我已經擁有了所有的爵士樂,去給我一個這個名字和它的類型的位置。

但我得到的錯誤:

非靜態方法需要一個目標

所有這些代碼是運行的最高水平的方法:

static void Main(string[] args){} 

本質上它只是一個控制檯應用程序。發生什麼了?

  • db是上下文類,這應該是顯而易見的。
  • 是我從CSV文件中提取數據,在這種情況下,列[40]會是這樣的「紐約」從堆棧跟蹤

完整的錯誤信息: {「非「}

注意:發佈爲」可能的答案「的問題在這種情況下無效,因爲我在此代碼中運行的主要方法是靜態的。

經進一步調查,我發現的名稱和類型都爲空的,所以我做了以下修訂:

if (name != null) 
{ 
    Location type = db.Locations.Where(l => l.name == name).FirstOrDefault(); 
    Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault(); 
    locationNearbyId = loc.id; 

    // More code 
} 

唉我仍然得到錯誤的:Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();

+1

哪裏*究竟*是錯誤?什麼是數據庫?什麼是「列」? –

+1

你能發佈完整的錯誤信息嗎?它談論哪種非靜態方法?在哪一行?的 – sepp2k

+0

可能重複的[非靜態方法需要一個目標C#(http://stackoverflow.com/questions/4577191/non-static-method-requires-a-target-c-sharp) – jbabey

回答

4

原來,因爲名字和類型可以be null類型必須放在if語句的旁邊,因此我必須在繼續之前檢查類型和名稱是否爲空:

name = collumns[40]; 
type = db.Locations.Where(l => l.name == name).FirstOrDefault(); 

if (name != null && type != null) 
{ 
    Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault(); 

    //More code.... 
} 
+1

這似乎不太可能是原因,因爲您給出的錯誤消息聽起來像是一個真正的編譯器錯誤。但是,你說過你把它當作例外。不幸的是,因爲你的問題非常模糊和不完整,所以很難幫助你或者確定這個答案是否確實相關。 –

+0

@JonSkeet當你不知道這意味着什麼時,錯誤是非常令人困惑的。當使用從linq查詢返回的變量時(我的查詢拉回一個對象),我也遇到了這個錯誤。那個對象竟然是'null'。一旦你知道它是一個空對象,它就意義重大。你正在調用一個沒有目標的非靜態方法('type.type')(目標'type'爲空)。這只是一個非常神祕的錯誤信息。 –

18

我碰巧遇到過這種情況今天。來了解一下,我這樣做:

Player player = db.Players 
    .Where(p => p.ClubID == course.Club.ID && p.IsActive == true && p.Phone != null) 
    .ToArray() 
    .SingleOrDefault(p => p.Phone.FormatPhoneNumber() == phone); 

其中course.Club正在通過EF從我的數據庫延遲加載。起初,我以爲我的問題是FormatPhoneNumber延伸,但後來發現,除去course.Club.ID固定的問題:

int clubID = course.Club.ID; 
Player player = db.Players 
    .Where(p => p.ClubID == clubID && p.IsActive == true && p.Phone != null) 
    .ToArray() 
    .SingleOrDefault(p => p.Phone.FormatPhoneNumber() == phone); 

,應避免使用在後續LINQ查詢延遲加載對象收集的價值觀 - 它們分配給本地變量,然後在查詢中使用這些變量。

+1

真棒解釋!這是一個常見的Linq gotchya,經常會被人遺忘,因爲在我使用Linq查詢之前,我總是會將本地對象的屬性評估爲局部變量,因爲您永遠不知道別人何時會盲目地重構代碼或重新生成數據類啓用延遲加載。 –

0

這是一個事實,問題是由於空「類型」的對象。 我會這樣解決:

var tType = type?.type; 
Location loc = db.Locations.Where(l => l.name == name && (type != null && l.type == tType)).FirstOrDefault(); 
相關問題