Linq Group DataTable结果的最大值

时间:2019-01-29 18:50:20

标签: c# linq datatable group-by

我正在努力消除一些记录,并尝试在Linq中使用GroupBy,但没有任何运气。

DataTable prices = (from t1 in product.AsEnumerable()
    join t2 in info.AsEnumerable() on (string)t1["productId"] equals (string)t2["productId"]
    where t1["Date"] == string.Empty || t1["Date"] == null
    select new {
        reference_id = t1["RscId"],
        last_name = t2["Last"],
        first_name = t2["First"],
        credentials = t2["Title"],
        price= t1["price"]
    }
)
.Distinct().CopyToDataTable();

我可以获得每一行的最高价格,但是我无法使用带有以下代码的g对象访问其他列:

var result = from row in prices.AsEnumerable()
    group row by new { price= row["price"] } into g
    select new
    {
        HighestPrice = g.Max(x => x["price"])
    };

如何从传入数据中获取所有列,但如何将行限制为列中具有最大值的行?

1 个答案:

答案 0 :(得分:1)

在您最后发表评论后,您的要求开始变得有意义。您具有其中一些产品可能具有相同价格的产品数据。您想知道价格最高的产品。

因此,按价格分组是一种可能的方法。为此,您需要具有最高密钥的组:

var products = new DataTable();
products.Columns.Add("ProductId", typeof(string));
products.Columns.Add("Name", typeof(string));
products.Columns.Add("Price", typeof(int));

int j = 0;
for (int i = 0; i < 30; i++)
{
    j++;
    products.Rows.Add(new object[] { i + 1, $"Prod{i:00}", i/10 + 1 });
}

var result = products.AsEnumerable().GroupBy(r => r.Field<int>("Price"))
    .OrderByDescending(g => g.Key)
    .Take(1);

(在Linqpad中)哪个给您:

enter image description here

三个价格分别为1、2和3的组。