2016-11-02 5 views
0

Ich benutze Entity Framework und Linq Query, ich möchte einige Daten mit einer where-Klausel mehrere auswählen.Mehrere wo Bedingungen in EF mit Lambda-Ausdrücke

In meinem DB habe ich in einem Feld mehrere IDs FieldOfInterestID, getrennt durch ";" (Ich weiß, ich weiß, aber es ist zu spät, etwas zu tun), oder nur eine ID, das bedeutet, dass das Komma nicht vorhanden sein wird

Ich möchte die Zeichenfolge mit dem ";" Trennzeichen und als all diese IDs, um sie in meiner WHERE-Klausel zu verwenden.

Mein Code sieht in etwa wie folgt aus:

await ctx.Customer.AsNoTracking() 
    .Where(e => e.UserId == userId) 
    .Select(e => new UserDTO { 
     FieldsOfStudy = ctx.Terms.Where(t => { 
      if (!e.FieldOfInterestID.Contains(";") && t.TermId.ToString() == e.FieldOfInterestID) 
       return true; 
      else if (e.FieldOfInterestID.Contains(";") 

      { 
       string fieldOfInterestIds = e.FieldOfInterestID.Split(";"); 
       foreach (string fieldOfInterestID in fieldOfInterestIds) 
       { 
        if (t.TermId.ToString() == e.FieldOfInterestID) 
         return true; 
        else 
         return false; 
       } 
      } 
      else 
       return false; 
     } 
    }) 
    .ToListAsync().ConfigureAwait(false); 

Mein aktueller "Fehler" ist not all code paths return a value...

Wie kann ich string [] in meiner where-Klausel besser nutzen?

+0

Ihre 'foreach()' wird 0 oder 1 mal laufen. Hast du das beabsichtigt?Der 0-fache Fall ist die Ursache für diesen Fehler, aber was möchten Sie wirklich für 2 oder mehr Elemente tun? –

+0

@HenkHolterman, nein, ich habe das nicht beabsichtigt :) –

+1

Sie brauchen [eine Gummiente] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) –

Antwort

2

Der aktuelle Fehler ist wegen dieser Zweig:

foreach (string fieldOfInterestID in fieldOfInterestIds) 
{ 
    if (t.TermId.ToString() == e.FieldOfInterestID) 
     return true; 
    else 
     return false; 
} 

Vom Compiler Sicht den Körper des foreach darf nicht eingegeben werden, daher not all code paths return a value....

Sie können das Problem beheben, indem Sie den return false; außerhalb des Körpers zu bewegen:

foreach (string fieldOfInterestID in fieldOfInterestIds) 
{ 
    if (t.TermId.ToString() == e.FieldOfInterestID) 
     return true; 
} 
return false; 

Dadurch wird der Compiler-Fehler beheben, aber das Problem nicht lösen. Sobald Sie es ausführen, werden Sie feststellen, dass LINQ to Entities keine Lambda-Ausdrücke mit der Methode body (=> { ... }) und string.Split unterstützt.

Die wirkliche Lösung erfordert ein anderes Kriterium - anstelle von nicht unterstützten

e.FieldOfInterestID.Split(";").Contains(t.TermId.ToString()) 

das Gegenteil aber unterstützt (verwendet String-Verkettung und string.Contains)

(";" + e.FieldOfInterestID + ";").Contains(";" + t.TermId + ";") 

beide Strings mit ; Enclosing benötigte korrekt zu handhaben Erste, Zwischen- und letzte Token.

Die letzte Abfrage wie folgt sein könnte:

var query = ctx.Customer.AsNoTracking() 
    .Where(e => e.UserId == userId) 
    .Select(e => new UserDTO 
    { 
     FieldsOfStudy = ctx.Terms 
      .Where(t => (";" + e.FieldOfInterestID + ";").Contains(";" + t.TermId + ";")) 
    }); 
1

Diese Linie scheint mir falsch:

string fieldOfInterestIds = e.FieldOfInterestID.Split(";");

ich es ändern würde:

string[] fieldOfInterestIds = e.FieldOfInterestID.Split(";");

Auch ich würde vereinfachen den Code ein wenig:

ctx.Terms.Where(t => return e.FieldOfInterestID.Split(";").Contains(t.TermId.ToString()));

Wenn die Zeichenfolge enthält nicht die ; Zeichen es sich um eine Zeichenfolge zurückgibt [] mit einem Element

+1

Gültige remakrks aber nichts in Bezug auf "nicht alle Code-Pfade geben einen Wert zurück" –

+0

Wenn ich .contains verwende, denke ich, dass ich den Split nicht mehr brauche, richtig? –

+0

@SGN 'Ich glaube, ich brauche nicht mehr die Split' Es hängt von den TermId-Werten. '" 135 ".Contains (" 3 ")' würde 'true' zurückgeben. Ähnlich wie 'String.IndexOf' ' "135; 12" .Split (";"). Enthält ("3") 'würde' false' '" 135; 12 ".Split ("; ") zurückgeben. Enthält ("12") 'würde" wahr "zurückgeben – bradbury9