2010-12-14 23 views
2

Gibt es ein Lambda-Äquivalent von IN? Ich werde wie alle Mittel auszuwählen, die mit ids entweder 4, 5 oder 6. Ein Weg, es zu schreiben ist:LINQ & Lambda-Ausdrücke entsprechen SQL In

Liste fundHistoricalPrices = lionContext.FundHistoricalPrices.Where (FHP => fhp.Fund.FundId == 5 || fhp.Fund.FundId == 6 || fhp.Fund.FundId == 7) .ToList();

Aber das wird schnell unüberschaubar, wenn ich es brauche, um 100 verschiedene fundIds zu vergleichen. Kann ich so etwas wie:

Liste fundHistoricalPrices = lionContext.FundHistoricalPrices.Where (FHP => fhp.Fund.FundId in (5,6,7)) ToList();.

Antwort

0

Sie können die Contains() -Methode für eine Auflistung verwenden, um das Äquivalent zu in zu erhalten.

var fundIds = new [] { 5, 6, 7 }; 

var fundHistoricalPrices = lionContext.FundHistoricalPrices.Where(fhp => fundIds.Contains(fhp.Fund.FundId)).ToList(); 
1

Es ist irgendwo in diese Richtung, aber ich kann nicht ganz mit dem Ansatz einverstanden sein, den Sie genommen haben. Aber dies wird tun, wenn Sie das wirklich tun wollen:

.Where(fhp => new List<int>{5,6,7}.Contains(fhp.Fund.FundId)).ToList(); 

Möglicherweise möchten Sie die Liste der IDs vor Ihrer LINQ-Abfrage konstruieren ...

0

Sie könnten eine Erweiterungsmethode wie folgt schreiben:

public static bool In<T>(this T source, params T[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 

Dann:

List fundHistoricalPrices = lionContext.FundHistoricalPrices.Where(fhp => fhp.Fund.FundId.In(5,6,7)).ToList(); 
0

Nein, der einzige ähnliche Betreiber mir bewusst bin, ist der Inhalt() functio n.

Eine andere war die Abfrage ist dynamisch zu konstruieren, indem das Prädikat Builder aus dem LINQkit mit: http://www.albahari.com/nutshell/predicatebuilder.aspx

Beispiel

int[] fundIds = new int[] { 5,6,7}; 

var predicate = PredicateBuilder.False<FundHistoricalPrice>(); 

foreach (int id in fundIds) 
{ 
    int tmp = id; 
    predicate = predicate.Or (fhp => fhp.Fund.FundId == tmp); 
} 

var query = lionContext.FundHistoricalPrices.Where (predicate);