linq, где call уменьшает количество обращений к моей базе данных (Custom build) - PullRequest
2 голосов
/ 06 июля 2010

У меня есть метод, который получает строки из моей базы данных. Это выглядит так:

public static IEnumerable<Dictionary<string, object>> GetRowsIter()
{
    _resultSet.ReadFirst();
    do
    {
        var resultList = new Dictionary<string, object>();
        for (int fieldIndex = 0; fieldIndex < _resultSet.FieldCount; fieldIndex++)
        {

            resultList.Add(_resultSet.GetName(fieldIndex), 
                           _resultSet.GetValue(fieldIndex));
        }
        yield return resultList;
    } while (_resultSet.ReadRelative(1));
    yield break;
}

Это здорово, когда я хочу вернуть все строки. Но иногда я хочу вернуть только некоторые строки.

Я планирую написать свой собственный метод (GetRowsIterWhere(string column, object whereValue)), но мне интересно, могу ли я использовать linq где в моем методе.

Признаюсь, я не знаю, как это будет работать, потому что я продвигаю читателя с помощью ReadRelative (1), чтобы перейти к следующему значению. Поэтому, даже если он «думает», что пропускает строки, он не пропустит их.

Я действительно обеспокоен производительностью здесь (в настоящее время я занимаюсь рефакторингом из Linq-To-Datasets, потому что он был слишком медленным.)

Итак, мой вопрос: нужно ли мне писать собственный метод типа Where или я могу изменить вышеописанный метод для работы с методом linq where?

1 Ответ

1 голос
/ 06 июля 2010

Да, вы можете использовать LINQ Where, но вам нужно создать предикат самостоятельно.Это не сложно.Что-то вроде (из памяти; без компилятора):

var param = Expression.Parameter(typeof(T), "row");
var body = Expression.Equal(
               Expression.PropertyOrField(param, column),
               Expression.Constant(whereValue));
var lambda = Expression.Lambda<Func<T,bool>>(body, param);

затем:

IQueryable<T> source = ...
var filtered = source.Where(lambda);

Это приведет к выполнению Where на сервере (например, вTSQL), удаляя большую часть сетевого ввода-вывода (например, разумный фильтр).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...