2013-05-15 13 views
8

Ich habe noch nie diesen Fehler gesehen und seine sehr verwirrend, ich im Wesentlichen etwas zu tun versuchen, wo ich alle Standorte finden Sie mich sagen, (wird nur eine Rückkehr), die die Ortsnamen in und die Art bestanden entsprechen:Nicht-statische Methode erfordert ein Ziel?

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(); 

Es gibt wahrscheinlich einen besseren Weg, um zu tun, was ich will auf einen Schlag, aber im Wesentlichen bekomme ich den Namen von einer Spalte (das kommt aus einer CSV-Datei), und dann sagen Sie mir, dass Orte Informationen. Danach sage ich jetzt ok, dass ich den ganzen Jazz habe, hol mir einen Ort mit diesem Namen und seinem Typ.

Aber ich bekomme die Fehlermeldung:

nicht-statische Methode erfordert ein Ziel

Die Top-Level-Methode alle dieser Code ausgeführt wird in ist:

static void Main(string[] args){} 

Wesentlichen seine nur eine Konsole App. So was ist los?

  • db die Kontextklasse ist, sollte dies offensichtlich.
  • Spalten ist ich die Daten aus der CSV-Datei ziehen, in diesem Fall Spalten [40] so etwas wie "New York"
  • wäre

Vollfehlermeldung aus dem Stack-Trace: { "Non -static-Methode erfordert ein Ziel. "}

Hinweis: Die als" mögliche Antwort "gestellte Frage hilft in diesem Fall nicht, da die Hauptmethode, in der ich diesen Code ausführe, statisch ist.

Bei der weiteren Untersuchung fand ich den Namen und den Typ waren null, so habe ich das folgende Update:

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 
} 

Ach ich noch die Störung an: Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();

+1

Wo * genau * ist der Fehler? Was ist "db"? Was sind "Spalten"? –

+1

Können Sie die vollständige Fehlermeldung posten? Von welcher nicht-statischen Methode spricht man? Auf welcher Linie? – sepp2k

+0

möglich Duplikat [Nicht-statische Methode erfordert ein Ziel C#] (http://stackoverflow.com/questions/4577191/non-static-method-requires-a-target-c-sharp) – jbabey

Antwort

4

Es stellte sich heraus, dass, weil Name und Typ können sein null-Typ muss Seite die if-Anweisung festgelegt und somit muss ich überprüfen, ob Typ und Name null sind vor continueing:

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

Dies scheint sehr unwahrscheinlich, da die Fehlermeldung, die Sie gegeben haben, klingt, als wäre es wirklich ein Compilerfehler. Aber dann hast du gesagt, dass du es als Ausnahme bekommst. Da Ihre Frage leider ziemlich vage und unvollständig ist, ist es schwer, Ihnen zu helfen oder sicher zu sagen, ob diese Antwort tatsächlich relevant ist oder nicht. –

+0

@JonSkeet Der Fehler ist sehr verwirrend, wenn Sie nicht wissen, was es bedeutet. Ich habe diesen Fehler auch erhalten, wenn ich eine Variable verwende, die von einer linq-Abfrage zurückgegeben wurde (meine Abfrage hat ein Objekt zurück gezogen). Dieses Objekt erwies sich als "null". Sobald Sie wissen, dass es ein Null-Objekt ist, macht es Sinn. Sie rufen eine nicht statische Methode ('type.type') ohne Ziel auf (das Ziel' type' ist null). Es ist nur eine wirklich kryptische Fehlermeldung. –

18

das hatte ich mir passieren heute. Kommen Sie, um herauszufinden, ich habe dies zu tun:

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

wo course.Club wurde faul belastete über EF aus meiner Datenbank. Zuerst dachte ich, mein Problem war die FormatPhoneNumber Erweiterung, fand aber dann, dass die course.Club.ID Entfernen das Problem behoben:

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); 

So vermeiden Werte von faulen belasteten Objekten in der folgenden LINQ-Abfragen gewonnenen mit - ordnen sie lokale Variablen und dann diese Variablen in Ihrer Abfrage verwenden.

+1

Super Erklärung! Es ist ein geläufiger Linq gotchya, der oft vergessen wird. In der Regel werte ich Eigenschaften lokaler Objekte immer auf lokale Variablen aus, bevor ich sie in Linq-Abfragen verwende, weil man nie weiß, wann jemand anders Ihren Code blind umgestaltet oder Ihre Datenklassen neu generiert Lazy Loading aktiviert. –

0

Es ist eine Tatsache, dass das Problem auf das Null "Typ" -Objekt zurückzuführen ist. würde ich diesen Weg lösen:

var tType = type?.type; 
Location loc = db.Locations.Where(l => l.name == name && (type != null && l.type == tType)).FirstOrDefault(); 
Verwandte Themen