2009-07-04 4 views
1

Ich versuche, das erste Element in der Datenbank zu erhalten, die ein gegebenes hat ‚UserGuid‘, sondern die ‚erste‘ Extension-Methode wirft die folgende Ausnahme: System.InvalidOperationException: Sequence contains no elementsunerwartete Ausnahme mit der Operation ‚Firsts‘ in LINQ to EF

Hier

sind einige Beispiele dafür, was funktioniert und was nicht:

// Works 
var FoundUser1 = MyEntities.Users.First(); 

// Works 
var FoundUser3 = MyEntities.Users.ToList().First(r => r.UserGuid == SampleUserGuid); 

// Throws System.InvalidOperationException: Sequence contains no elements. 
var FoundUser2 = MyEntities.Users.First(r => r.UserGuid == SampleUserGuid); 

Wer irgendwelche Ideen?

EDIT

Weitere seltsame Codebeispiele:

// UserList1 is empty 
var Query1 = from x in MyEntities.Users 
      where x.UserGuid == criteria.Value 
      select x; 
var UserList1 = Query1.ToList(); 


// UserList2 has 3 users, including one with a 
// matching guid value. 
var Query2 = from x in MyEntities.Users 
      select x; 
var UserList2 = Query2.ToList(); 
var Query22 = from x in Query2 
       where x.UserGuid == criteria.Value 
       select x; 
var UserList22 = Query22.ToList(); 

// Works 
User FoundUser = null; 
foreach (var ThisUser in MyEntities.Users) 
{ 
    if (ThisUser.UserGuid == criteria.Value) 
     FoundUser = ThisUser; 
} 

Antwort

0

Es stellt sich heraus, das Problem war mit SQLite Übergabe von GUID-Typen. Wenn Sie

BinaryGuids=True 

festlegen, werden sie als 16-Byte-Binärdateien gespeichert und können nicht mit String-basierten GUIDs "verglichen" werden. Sie können das auch auf false setzen und sie passen als Zeichenfolgen, aber Sie müssen die Groß-/Kleinschreibung für die Alpha-Zeichen beachten.

+0

Der Vergleich mit ToString() sollte immer funktionieren, unabhängig von der Einstellung für BinaryGuids. –

4

Was die Ausnahme, es ist ein "Empty Set" Ausnahme oder etwas ähnliches?

Versuchen

FirstOrDefault() 

Statt

First() 

und sehen, was passiert. First() wird eine Ausnahme auslösen, wenn keine Datensätze verfügbar sind. FirstOrDefault() wird Ihnen ein leeres Benutzerobjekt geben, wenn keine Datensätze verfügbar sind.

+0

Die 'Menge' ist leer, aber die Frage ist 'warum' ist die Menge leer, wenn dort gültige Daten vorhanden sind (wie in allen 'Arbeitsbeispielen' gezeigt). – JasonRShaver

0

In diesem Stück Code:

// UserList1 is empty 
var Query1 = from x in mgr.ObjectContext.Users 
      where x.UserGuid == criteria.Value 
      select x; 
var UserList1 = Query1.ToList(); 

Was ist der Wert von criteria.Value ist, wenn Sie es debug.print?

+0

Die Kriterien sind: {e7bf9773-8231-44af-8d53-e624f0433943} Die 3 in meiner Beispieldatenliste (die in UserList2 zeigen) sind: {7ab8196e-f0bd-4db3-b6b4-3513c18b7c7f} {1dd40287 -35a4-42cd-a380-c458c8ca7e62} {e7bf9773-8231-44af-8d53-e624f0433943} – JasonRShaver

+0

Das formatierte besser, wenn ich es eintippte. =) – JasonRShaver

+0

Was sind die Arten von UserGuid und Value? Sind sie beide Saiten? –

0

Probieren Sie mal die String-Werte zu vergleichen, wie in

x.UserGuid.ToString() == criteria.Value.ToString() 

Es gibt andere Beispiele im Internet von Menschen, die direkt Mühe zu vergleichen guids haben. Hier ist eine: http://bytes.com/groups/net-vb/364009-comparing-guids