DataTable: получить максимальное значение с помощью LINQ With Criteria Field (GroupBy) - PullRequest
4 голосов
/ 04 марта 2012

У меня есть DataTable, структурированный так:

username |цена

"Джек" .01

"Джек" .02

"Мэри" .03

"Мэри" .04

Как я могу использовать LINQ в DataTable для возврата МАКСИМАЛЬНОЙ ЦЕНЫ НА ДЖЕК (например: .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»).

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 распознавать поле «Цена» как строго типизированное.Угадай, это связано с проблемой.

Конечно, будут работать два запроса (один для фильтрации по имени пользователя, затем другой для выбора Макса, но это не так элегантно.

Относительно этого ответа . Попробовал толькообо всем / посмотрел все, но не повезло.

Спасибо.

Ответы [ 3 ]

10 голосов
/ 04 марта 2012

Вы не можете получить доступ к "цене" таким образом, поскольку на DataRow нет члена 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();
5 голосов
/ 04 марта 2012

Вы пробовали:

var query = tbl.AsEnumerable().Where(tr => (string) tr["username"] == "jack")
               .Max(tr => (double) tr["price"]);
3 голосов
/ 04 марта 2012
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...