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,但它没有那么优雅

与此答案相关。几乎什么都试过了/看了一遍,但没有运气。

谢谢。

DataTable:使用LINQ With Criteria字段(GroupBy)获取最大值

由于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的建议选择最大值。