简体   繁体   中英

Get min value in row during LINQ query

I know that I can use .Min() to get minimum value from column, but how to get minimum value in a row?

I have following LINQ query (for testing purposes):

from p in Pravidloes
where p.DulezitostId == 3
where p.ZpozdeniId == 1 || p.ZpozdeniId == 2
where p.SpolehlivostId == 2 || p.SpolehlivostId == 3

group p by p.VysledekId into g
select new {
  result = g.Key,
  value = g
}

Which results into this:
linqqueryimage

I would however like to get only the MIN value of following three columns:
DulezitostId, ZpozdeniId, SpolehlivostId as a value in:

select new {
  result = g.Key,
  value = g // <-- here
}

The final result then should look like:
result: 2, value: 1
result: 3, value: 2

I have been looking for similar questions here and googled for few examples with grouping and aggregating queries, but found nothing that would move me forward with this problem.

Btw: Solution isn't limited to linq, if you know better way how to do it.

You could create an array of the values and do Min on those.

select new {
  result = g.Key,
  value = g.SelectMany(x => new int[] { x.DulezitostId, x.ZpozdeniId, x.SpolehlivostId }).Min()
}

This will return the min for those 3 values in each grouping for ALL rows of that grouping.

Which would result in something like this...

result: 3, value: 1

The below will select the min for each row in the grouping...

select new {
  result = g.Key,
  value = g.Select(x => new int[] { x.DulezitostId, x.ZpozdeniId, x.SpolehlivostId }.Min())
}

Which would result in something like this...

result: 3, value: 1, 2

The best solution if you're using straight LINQ is Chad's answer . However, if you're using Linq To SQL it won't work because you can't construct an array like that.

Unfortunately, I believe the only way to do this in Linq To Sql is to use Math.Min repeatedly:

select new {
  result = g.Key,
  value = Math.Min(Math.Min(DulezitostId, ZpozdeniId), SpolehlivostId)
}

This will generate some ugly CASE WHEN ... statements, but it works.

The main advantage of doing it this way is that you're only returning the data you need from SQL (instead of returning all 3 columns and doing the Min in the application).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM