我有一个从我的数据库中获取行的方法。它看起来像这样:
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
方法?
答案 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(使用合理的过滤器)。