【问题标题】:QueryExtender Linq Orderby using TimeSpan.ParseQueryExtender Linq Orderby 使用 TimeSpan.Parse
【发布时间】:2012-08-30 06:49:19
【问题描述】:

基本上我有一个 ASP.NET 的 QueryExtender 控件和 首先,我需要将 sql varchar 值转换为 CSharp 类型的 TimeSpan,然后对其应用 Linq OrderBy 子句,但执行时会出错。

这是我的代码:

  protected void FilterProducts(object sender, CustomExpressionEventArgs e)
    {
      e.Query = (from p in e.Query.Cast<accounts>()
                  select p).OrderBy(p=> TimeSpan.Parse(p.TimeTo));
    }

错误: LINQ to Entities 无法识别方法“System.TimeSpan Parse(System.String)”方法,并且该方法无法转换为存储表达式。

【问题讨论】:

  • p.TimeTo 是什么样的?你不能按字符串排序吗?
  • 1.您也许可以使用 SqlFunctions (msdn.microsoft.com/en-us/library/dd466176.aspx)。但是你能展示 TimeTo 的例子吗? 2.如果TimeTo表示Time值,为什么DB中是Varchar?
  • p.TimeTo 是 sql server 中的 varchar 类型,例如:1:00
  • @RaphaëlAlthaus 基本上我使用的是 sql server 2005,你知道 Time 类型在这个版本中不可用

标签: c# asp.net linq query-extender


【解决方案1】:

在不知道p.TimeTo 数据的所有形状的情况下,我认为您可以使用字符串值进行排序,这样:

from p in e.Query.Cast<accounts>()
select p).OrderBy(p => p.TimeTo.Length).ThenBy(p => p.TimeTo)

这样,值1:00 将排在11:00 之前。

编辑

采取:

var s = new[] { "12:10", "8:00", "8:20",  "1:00", "1:02", "10:00", "11:10" };

看看两者的区别

s.OrderBy (x => x);

s.OrderBy (x => x.Length).ThenBy (x => x);

这是:

1:00
1:02
10:00
11:10
12:10
8:00
8:20

1:00
1:02
8:00
8:20
10:00
11:10
12:10

【讨论】:

  • 我有 1:00 到 24:00 在外地。
  • 我认为不是因为您知道 11:00 和 10:00 的长度相同,所以我们如何确保 10:00 先到???
  • 杰特·阿诺德的伟大工作:) 接受
【解决方案2】:

这是因为 TimeSpan.Parse 在商店中不可用,如果您使用 SQLServer,您的查询将被转换为 SQL,并且该商店没有 TimeSpan.Parse,一种方法是将其转换为列表,然后再次查询。

e.Query = (from p in e.Query.Cast<accounts>()
           select p).ToList().OrderBy(p=> TimeSpan.Parse(p.TimeTo));

但是如果ToList返回大量数据,上述解决方案可能会导致一些问题。

【讨论】:

  • 你也可以看到这个帖子stackoverflow.com/questions/4146300/…
  • 这是一个危险的变通方法,如果 ToList() 返回大量数据会怎样?
  • @MuhammadAdnanSaleem,你没看到我回答的最后一行吗?我已经说过了。这就是这种方法的问题。由你决定
  • 谢谢哈比布,但还有其他解决方法吗?还是等待 linq 和实体框架的下一个版本? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多