2011-01-13 10 views
0

表現使用して、一般的なクエリメソッドを構築する必要があり、これはおそらく非常に簡単ですが、私はMongoDBのためにLINQを使用して、正常に動作します以下の方法があります。は、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; 
} 

しかし、私はしたいと思いますそれはのようなものを返すだろうと期待して

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; 
} 

:、同様のパラメータを使用して(投影用)、それに対して「選択」(明らかに動作しません)このように見えるかもしれない何かを追加以下:

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

本質的には、返す関数にSELECTパラメータを渡す方法を知る必要があります。LINQに慣れていなくても、ソリューションをオンラインで見つけるのは驚くほど困難です。

ありがとうございます。

答えて

2

Selectコールの結果を表すには、別の汎用タイプが必要です。

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

これは素晴らしいです、ティム!次のようにメソッドを呼び出すと、匿名型を "SomeEntity"に暗黙的に変換しようとしているというエラーメッセージが表示されますが、これをどのように修正できるか知っていますか?メソッド呼び出し:var result = SingleWithSelect (x => x.Id == id、y => new {y.SomeEntity}); – Mikalee

+0

何を返そうとしていますか? 'new {SomeEntity = y.SomeEntity}'や 'SomeEntity'のような匿名型ですか? ''はあなたが 'SomeEntity'を返そうとしていると言います。匿名型を返す場合は、 'var result = SingleWithSelect(x => x.Id ... etc')を呼び出してください。 –

+0

SomeEntityを返すのですが、文法に問題があります。これで行くでしょう... – Mikalee

関連する問題