DataTable:使用LINQ With Criteria字段(GroupBy)获取最大值
本文关键字:GroupBy 获取 最大值 字段 Criteria 使用 LINQ With DataTable | 更新日期: 2023-09-27 18:26:49
我有一个结构如下的DataTable:
用户名|价格
"千斤顶";.01
"千斤顶";.02
"玛丽;.03
"玛丽;.04
我如何在DataTable上使用LINQ来返回JACK的最大价格(例如:.02)?
设置表的代码(可以忽略)。
DataTable tbl = new DataTable();
tbl.Columns.Add("username");
tbl.Columns["username"].DataType = typeof(string);
tbl.Columns.Add("price");
tbl.Columns["price"].DataType = typeof(double);
DataRow r = tbl.NewRow();
r["username"] = "jack"; r["price"] = .01;
tbl.Rows.Add(r);
r = tbl.NewRow();
r["username"] = "jack"; r["price"] = .02;
tbl.Rows.Add(r);
r = tbl.NewRow();
r["username"] = "mary"; r["price"] = .03;
tbl.Rows.Add(r);
r = tbl.NewRow();
r["username"] = "mary"; r["price"] = .04;
tbl.Rows.Add(r);
这就是我陷入困境的地方。想用他的最高价格(例如:".02")为Jack退一排。
var result =
from row in tbl.AsEnumerable()
where (string) row["username"] == "jack"
group row by new {usernameKey = row["username"]} into g
select new
{
//WHAT IS THE LINQ SYNTAX TO USE HERE?
jackHighestPrice = g.Max(x => x.price); //This doesn't work, VS doesn't see the "price" field as strongly typed (not sure why).
};
//This should display Jack's highest price.
MessageBox.Show(result.First().jackHighestPrice.ToString());
我不知道如何让Visual Studio识别";价格"字段为强类型。猜测这与问题有关。
当然,有两个查询可以工作(一个是按用户名过滤,另一个是选择Max,但它没有那么优雅
与此答案相关。几乎什么都试过了/看了一遍,但没有运气。
谢谢。
由于DataRow
上没有price
成员,因此不能以这种方式访问"price"。访问它就像使用username
一样(按列名):
var result =
from row in tbl.AsEnumerable()
where (string) row["username"] == "jack"
group row by new {usernameKey = row["username"]} into g
select new
{
jackHighestPrice = g.Max(x => x["price"])
};
当然你可以简单地做:
string max = tbl.AsEnumerable()
.Where(row => row["username"].ToString() == "jack")
.Max(row => row["price"])
.ToString();
你尝试过吗:
var query = tbl.AsEnumerable().Where(tr => (string) tr["username"] == "jack")
.Max(tr => (double) tr["price"]);
var result =
from row in tbl.AsEnumerable()
where (string)row["username"] == "jack"
let x = new { usernameKey = (string)row["username"], (double)price = row["price"] }
group x by x.usernameKey into g
select g.Max(x => x.price);
但是,由于只允许一个用户,因此不需要进行分组。只需按照@WorldIsRound的建议选择最大值。