Asp.net gridview 按年龄排序
Asp.net gridview Sorting by age
我有一个包含“年龄”列的 table,其中排序后的年龄显示如下:
10 years,
105 years
18 years,
60 years.
8 months.
我怎样才能不按字母顺序排序,而是正确排序。
我无法消除“年”字。
嗯,如果这是来自数据库?
那么你可以这样做:
SELECT id, FirstName, LastName, Age,
cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer) as NumAge
FROM tblCustomers
ORDER BY NumAge
所以,现在您有一个文本显示列,但您还有一个真实的“数字”列,其中包含以年为单位的实际数字 - 您可以在该 NumAge 列上正确排序。这种排序也可以通过数据视图排序来完成 - 因此,无论您如何 were/are 对数据进行排序,如果您添加从该列中提取数字的上述列,则按 NumAge 排序将成为一个可能的选择。
现在如果我们不混合使用月份和年份,上面的方法就可以工作了。但是,为了处理这个问题,我们将上面的内容更改为:
SELECT id, FirstName, LastName, Age,
CASE
WHEN CharIndex('month',Age) > 0 THEN
(cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer))
WHEN CharIndex('year',Age) > 0 THEN
(cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) * 12 as integer))
END
AS AgeInMonths
FROM tblCustomers
ORDER BY AgeInMonths
因此,我们现在再次有了一个数字和以月为单位的年龄值,并且可以对其进行排序。所以我们显示年龄+文本列,但是排序表达式可以使用AgeInMonths,结果是正确顺序的数据。
如果你有时间呢?然后我会用月 * 12 代替月 * 30,而对于年,则只使用 * 365。因此,支持年、月或日并不难。
结果再次是,数据按给定年龄按数字顺序排序。
问题也是“个”。 8 个月大于 2 年还是 8 个月大于 0 年?
如果是最后一个,您可以使用 Linq
。
让我们说这是年龄。
var age = new List<string>()
{
"10 years,",
"105 years",
"18 years,",
"60 years.",
"8 months.",
"1 year.",
"18 months,",
};
那你就可以这样做了。它按月和年拆分列表。然后删除除数字以外的所有字符。如果是一个月,则除以 12 得到年份。然后排序,重新做成字符串,加上"years"。
var sortedAge = age.Where(x => x.ToLower().Contains("month"))
.Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit))) / 12)
.Concat(age.Where(x => x.ToLower().Contains("year"))
.Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit)))))
.OrderBy(y => y)
.Select(z => z > 1 ? z.ToString() + " years" : z.ToString() + " year").ToList();
结果
0 year
1 year
1 year
10 years
18 years
60 years
105 years
但是您最好还是将年龄作为 int 存储在 DOB 中,或者更好的是,将出生日期存储为 datetime。
我有一个包含“年龄”列的 table,其中排序后的年龄显示如下:
10 years,
105 years
18 years,
60 years.
8 months.
我怎样才能不按字母顺序排序,而是正确排序。 我无法消除“年”字。
嗯,如果这是来自数据库?
那么你可以这样做:
SELECT id, FirstName, LastName, Age,
cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer) as NumAge
FROM tblCustomers
ORDER BY NumAge
所以,现在您有一个文本显示列,但您还有一个真实的“数字”列,其中包含以年为单位的实际数字 - 您可以在该 NumAge 列上正确排序。这种排序也可以通过数据视图排序来完成 - 因此,无论您如何 were/are 对数据进行排序,如果您添加从该列中提取数字的上述列,则按 NumAge 排序将成为一个可能的选择。
现在如果我们不混合使用月份和年份,上面的方法就可以工作了。但是,为了处理这个问题,我们将上面的内容更改为:
SELECT id, FirstName, LastName, Age,
CASE
WHEN CharIndex('month',Age) > 0 THEN
(cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer))
WHEN CharIndex('year',Age) > 0 THEN
(cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) * 12 as integer))
END
AS AgeInMonths
FROM tblCustomers
ORDER BY AgeInMonths
因此,我们现在再次有了一个数字和以月为单位的年龄值,并且可以对其进行排序。所以我们显示年龄+文本列,但是排序表达式可以使用AgeInMonths,结果是正确顺序的数据。
如果你有时间呢?然后我会用月 * 12 代替月 * 30,而对于年,则只使用 * 365。因此,支持年、月或日并不难。
结果再次是,数据按给定年龄按数字顺序排序。
问题也是“个”。 8 个月大于 2 年还是 8 个月大于 0 年?
如果是最后一个,您可以使用 Linq
。
让我们说这是年龄。
var age = new List<string>()
{
"10 years,",
"105 years",
"18 years,",
"60 years.",
"8 months.",
"1 year.",
"18 months,",
};
那你就可以这样做了。它按月和年拆分列表。然后删除除数字以外的所有字符。如果是一个月,则除以 12 得到年份。然后排序,重新做成字符串,加上"years"。
var sortedAge = age.Where(x => x.ToLower().Contains("month"))
.Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit))) / 12)
.Concat(age.Where(x => x.ToLower().Contains("year"))
.Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit)))))
.OrderBy(y => y)
.Select(z => z > 1 ? z.ToString() + " years" : z.ToString() + " year").ToList();
结果
0 year
1 year
1 year
10 years
18 years
60 years
105 years
但是您最好还是将年龄作为 int 存储在 DOB 中,或者更好的是,将出生日期存储为 datetime。