2016-11-15 2 views
1

Ich versuche, eine Textsuche für eine Teileigenschaftsübereinstimmung für verwandte Entitäten durchzuführen.Partielle Linktextsuche mit Enthält

Meine Einheiten sind:

public class TradeContact 
{ 
    [Key] 
    public int TradeContactId { get; set; } 

    public virtual ICollection<Region> Regions { get; set; } 

} 

public class Region 
{ 
    [Key] 
    public int RegionId { get; set; } 
    public virtual ICollection<TradeContact> TradeContacts { get; set; } 
} 

Mein Ziel ist es, dass, wenn ein TradeContact die folgenden Regionen hat: Sydney, Brisbane, Darwin, dann sollte ich für ‚Syd‘ suchen können, dass TradeContact Datensatz abzurufen.

Derzeit wie dies Ich suche:

TradeContacts = TradeContacts 
    .Where(s => s.Regions.Select(x => x.Name.ToUpper()) 
    .Contains(searchString.ToUpper())); 

Dieser Code vollständige Übereinstimmungen gefunden werden, so ‚Sydney‘ wird meinen TradeContact zurückkehren, aber es auf teilweise Übereinstimmungen nicht funktioniert.

Was habe ich falsch gemacht?

+0

@wudzik Dies ist kein Duplikat dieser Frage. OP weiß bereits, wie man einen Vergleich durchführt, sie fragen, wie man den Vergleich in einer Liste von Strings mit LINQ durchführt. Genauer gesagt fragen sie, was mit der aktuellen Lösung, die sie haben, falsch ist, da sie bei Teilübereinstimmungen nicht übereinstimmt. – Abion47

+0

Nun, bis diese Frage unflagged wird, hier ist Ihr Arbeitscode, und Entschuldigung, dass ich es nicht besser als Kommentar formatieren kann: 'TradeContacts = TradeContacts.Where (s => s.Regions.Any (r => r.Name .ToUpper(). Enthält (searchString.ToUpper()))); ' – Abion47

+0

@wudzik Diese Frage bezieht sich nicht auf die Frage, die Sie in _any_ way als doppelt markiert haben. – Evk

Antwort

2

versuchen Es ist wichtig, zu verstehen, warum gegenwärtige Ansatz nicht funktioniert.

TradeContacts 
.Where(s => s.Regions.Select(x => x.Name.ToUpper()) 
.Contains(searchString.ToUpper())); 

Wenn die menschliche Sprache zu übersetzen, wäre es: Gib mir Kontakte, wo die Liste der Regionen Region mit dem Namen gleich zu searchString- enthalten. So enthält die Sie verwenden nicht String.Contains, dann ist es IEnumerable.Contains:

var regionNames = new List<string>(); 
var match = regionNames.Contains(searchString); 

Wie Sie sehen, dass in der Tat nur übereinstimmt, wenn Region Name gleich Ihren Suchbegriff ein.

TradeContacts.Where(s => s.Regions. 
    Any(x => x.Name.ToUpper().Contains(searchString.ToUpper())); 

Dies ist anders: Gib mir alle Kontakte, wo jede Region Namen hat die searchString- enthält.

2

Sie können so etwas wie dieses

var result = TradeContacts.Where(s => s.Regions. 
      Any(x => x.Name.ToUpper().Contains(searchString.ToUpper())); 

if(result!=null) 
//do your stuff. 
+0

Dies gibt nur das erste gefundene Ergebnis zurück, im Gegensatz zu allen übereinstimmenden Entitäten. – Abion47

+0

Sie können wo in diesem Fall verwenden – mybirthname

1

Okay, hier ist die Antwort, die ich vorher geschrieben:

TradeContacts = TradeContacts.Where(
      s => s.Regions.Any(
       r => r.Name.ToUpper().Contains(searchString.ToUpper()))); 

Der Grund Ihrer aktuellen Code nicht funktioniert, ist, weil Sie die Contains Prüfung auf der Liste der Namen durchführen, die für die exakte die Liste überprüft Übereinstimmungen, wenn Sie die Namen selbst überprüfen möchten.