【发布时间】:2019-07-18 12:43:31
【问题描述】:
是否可以创建一个 Linq 来检索 DataReader 列的最长字符串值?列数据应转换为字符串,然后返回最长的字符串。
到目前为止,我所知道的是如何使用可枚举的 DataTable 获得相同的东西(正如我所问的 here),例如:
string maxString = dt
.AsEnumerable()
.Select(row => row[mycolumn].ToString())
.OrderByDescending(st => st.Length)
.FirstOrDefault();
我尝试过像这样组合 DataReader 的上层解决方案:
var enumerable = reader
.Cast<IDataRecord>();
string max_string = enumerable
.Select(record => record.GetName(col).ToString())
.Aggregate((s, a) => a.Length > s.Length ? a : s);
不幸的是,这不起作用,我明白了
序列不包含 at 中的元素 System.Linq.Enumerable.Aggregate
错误。提前感谢您的帮助:)
编辑:我正在寻找一种解决方案,无需直接从 DataReader 对象将数据加载到 Datatable 等中。我试图避免“内存不足异常”,因为数据很大。
Power Mouse 建议的最新尝试(它返回正确的值,但仅来自第 1 列):
for (int col = 0; col < reader.FieldCount; col++)
{
string col_name = reader.GetName(col).ToString();
var enumerable = reader.Cast<IDataRecord>();
string max_string = enumerable.Where(x => enumerable.Max(y => y[col_name].ToString()
.Length) == x[col_name].ToString().Length)
.FirstOrDefault()?[col_name].ToString();
Console.WriteLine("max string of column is : " + max_string);
}
【问题讨论】:
-
Sequence contains no elements这意味着什么?另见stackoverflow.com/questions/8867867/…。 -
这似乎应该在源头完成,即
select top 1 [SomeColumn] from [SomeTable]order by len([SomeColumn]) desc? -
@Marc Gravell,我将这个选项留给场景如果我没有找到 Linq 的解决方案,因为 DataReader 读取的查询不是那么小,所以使用“order by”进行计算需要很多时间,恕我直言。
-
@Lucy82 如果查询不是那么小,那就更有理由在源头执行它并且只通过网络带回一行,而不是带回 tons网络上的数据只是为了丢弃除一行之外的所有数据
-
我认为如果你使用sql查询得到你想要的结果会更好
标签: c# linq datareader