需要使用LINQ表达式构建通用查询方法

时间:2011-01-13 18:11:16

标签: .net linq mongodb norm

我是新的,这可能非常简单,但我有以下方法,使用LINQ for MongoDB可以正常工作:

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

但我想添加一个&#34; Select&#34;对于它(用于投影)也使用参数,这可能看起来像这样(显然不起作用):

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时,很难在线找到解决方案。

谢谢。

1 个答案:

答案 0 :(得分: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;
}