Необходимо создать общий метод запроса с использованием выражений LINQ. - PullRequest
0 голосов
/ 13 января 2011

Я новичок, и это, вероятно, очень тривиально, но у меня есть следующий метод, который отлично работает, используя LINQ для 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;
}

Но я хотел бы добавить к нему «Выбрать» (для проекции) с использованием параметра, что-то, что может выглядеть так (что, очевидно, не работает):

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 Ответ

2 голосов
/ 13 января 2011

Вам нужен другой универсальный тип для представления результата вызова 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;
}
...