看起来您想要pivot 这个数据,但使用的是 Linq 而不是 T-SQL。 (或其他一些 SQL 方言)
执行此操作的基本模式是使用SelectMany 将每一行转换为
一组键/值对,您可以在其上执行OrderByDescending。
一个有点通用的模式如下:
// The values that we want to query.
// In your case, it's essentially the table that you're querying.
// I used an anonymous class for brevity.
var values = new[] {
new { key = 99, a = 0, b = 4, c = 5, d = 9, e = 2 },
new { key = 100, a = 0, b = 5, c = 3, d = 2, e = 10 }
};
// The query. I prefer to use the linq query syntax
// for actual SQL queries, but you should be able to translate
// this to the lambda format fairly easily.
var query = (from v in values
// Transform each value in the object/row
// to a name/value pair We include the key so that we
// can distinguish different rows.
// Because we need this query to be translated to SQL,
// we have to use an anonymous class.
from column in new[] {
new { key = v.key, name = "a", value= v.a },
new { key = v.key, name = "b", value= v.b },
new { key = v.key, name = "c", value= v.c },
new { key = v.key, name = "d", value= v.d },
new { key = v.key, name = "e", value= v.e }
}
// Group the same row values together
group column by column.key into g
// Inner select to grab the top two values from
// each row
let top2 = (
from value in g
orderby value.value descending
select value
).Take(2)
// Grab the results from the inner select
// as a single-dimensional array
from topValue in top2
select topValue);
// Collapse the query to actual values.
var results = query.ToArray();
foreach(var value in results) {
Console.WriteLine("Key: {0}, Name: {1}, Value: {2}",
value.key,
value.name,
value.value);
}
但是,由于您只有一行,因此逻辑变得更加简单:
// The value that was queried
var value = new { key = 99, a = 0, b = 4, c = 5, d = 9, e = 2 };
// Build a list of columns and their corresponding values.
// You could even use reflection to build this list.
// Additionally, you could use C# 7 tuples if you prefer.
var columns = new[] {
new { name = "a", value = value.a },
new { name = "b", value = value.b },
new { name = "c", value = value.c },
new { name = "d", value = value.d },
new { name = "e", value = value.e }
};
// Order the list by value descending, and take the first 2.
var top2 = columns.OrderByDescending(v => v.value).Take(2).ToArray();
foreach(var result in top2) {
Console.WriteLine("Column: {0}, Value: {1}", result.name, result.value);
}