linq where call reduce对我的数据库的调用(自定义构建)

时间:2010-07-05 22:02:32

标签: c# linq yield

我有一个从我的数据库中获取行的方法。它看起来像这样:

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 个答案:

答案 0 :(得分:1)

是的,您可以使用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中),删除大部分网络IO(使用合理的过滤器)。