2011-01-13 36 views
0

我是新來構建一個通用的查詢方法,這可能是很微不足道,但我有以下的方法,工作正常,使用LINQ MongoDB的:需要使用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 2011-01-13 18:39:32