2011-01-13 7 views
0

Ausdrücke Ich bin neu und dies ist wahrscheinlich sehr trivial, aber ich habe die folgende Methode, die gut funktioniert, mit LINQ für MongoDB:Benötigen Sie eine allgemeine Abfragemethode bauen mit LINQ

public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> whereExpression) where T : class, new() 
{ 
    T retval = default(T); 
    using (var db = Mongo.Create(_connectionString)) 
    { 
     retval = db.GetCollection<T>().AsQueryable() 
        .Where(whereExpression).SingleOrDefault(); 
    } 
    return retval; 
} 

Aber ich möchte fügen sie ein „Select“, um es (für die Projektion) als auch einen Parameter verwenden, etwas, das wie folgt aussehen (was natürlich nicht funktioniert):

public T SingleWithSelect<T>(System.Linq.Expressions.Expression<Func<T, bool>> whereExpression, System.Linq.Expressions.Expression<Func<T, bool>> selectExpression) where T : class, new() 
{ 
    T retval = default(T); 
    using (var db = Mongo.Create(_connectionString)) 
    { 
     retval = db.GetCollection<T>().AsQueryable() 
        .Where(whereExpression) 
        .Select(selectExpression) 
        .SingleOrDefault(); 
    } 
    return retval; 
} 

In der Hoffnung, dass es etwas ähnliches zurückkehren werde die folgenden:

var results = db.GetCollection<Entity>("Entities").AsQueryable() 
.Where(i => i.Id == someId) 
.Select(y => new { y.SomeEntity }).SingleOrDefault(); 

Im Wesentlichen muss ich nur wissen, wie man den SELECT-Parameter in die Rückkehrfunktion übergibt - überraschend schwierig, die Lösung online zu finden, wenn sie LINQ so wenig vertraut sind.

Vielen Dank.

Antwort

2

Sie benötigen einen weiteren generischen Typ, um das Ergebnis des Aufrufs Select darzustellen.

public TResult SingleWithSelect<T, TResult>(
    Expression<Func<T, bool>> whereExpression, 
    Expression<Func<T, TResult>> selectExpression) 
    where T : class, new() 
{ 
    TResult retval = default(TResult); 
    using (var db = Mongo.Create(_connectionString)) 
    { 
     retval = db.GetCollection<T>().AsQueryable() 
        .Where(whereExpression) 
        .Select(selectExpression) 
        .SingleOrDefault(); 
    } 
    return retval; 
} 
+0

Das ist toll, danke Tim! Wenn ich die Methode unter Verwendung des folgenden Aufrufs erhalte, bekomme ich eine Fehlermeldung, dass ich versuche, den anonymen Typ implizit in "SomeEntity" zu konvertieren, weißt du, wie ich das auch beheben könnte? Methodenaufruf: var result = SingleWithSelect (x => x.Id == id, y => neu {y.SomeEntity}); – Mikalee

+0

Was möchten Sie zurückgeben - ein anonymer Typ wie 'new {SomeEntity = y.SomeEntity}' oder ein 'SomeEntity'? Die '' sagt, dass Sie eine 'SomeEntity' zurückgeben wollen. Wenn Sie einen anonymen Typ zurückgeben möchten, rufen Sie 'var result = SingleWithSelect (x => x.Id ... etc'. –

+0

Ich möchte SomeEntity zurückgeben, ich habe nur Probleme mit der Syntax (lernen LINQ wie ich gehen Sie mit diesem) ... – Mikalee

Verwandte Themen