【问题标题】:Linq Error: InvalidOperationException: Could not translate expressionLinq 错误:InvalidOperationException:无法翻译表达式
【发布时间】:2019-12-11 14:28:57
【问题描述】:

从 DateTime 列中获取值 如果为 null 则返回 String.Empty 别的 DateTime.ToShortDateString

我在做什么错 => 查询产生如下:

var queryable = from p in Products
    select new {
               selldate = p.SellEndDate == null
                           ? string.Empty
                           : p.SellEndDate.Value.ToShortDateString()  };

错误:InvalidOperationException:无法翻译表达式'Table(Product).Select(p => new f__AnonymousType01(selldate = IIF((p.SellEndDate = null), Invoke(value(System.Func1[System.String])),p.SellEndDate.Value.ToShortDateString()))) ' 到 SQL 中,无法将其视为本地表达式。

【问题讨论】:

    标签: linq


    【解决方案1】:

    基本上这里发生的事情是 LINQ to SQL 正在获取您的整个查询并尝试将其转换为 SQL Server 可以理解的内容。但问题是 SQL Server 没有 DateTime.ToShortDateString 的概念,因此无法转换为 SQL。

    您必须更改您的查询,以便它只选择 SellEndDate(它将作为Nullable<DateTime> 获取),然后当您使用该查询的结果时,您可以转换为字符串。例如:

    var list = (from p in Products
               select p.SellEndDate).ToList();
    
    // calling ToList() above means we have the entire resultset in memory and
    // no longer have to pass the query back to SQL Server
    
    var stuff = from p in list select new
    { 
        selldate = p.SellEndDate == null ?
                       string.Empty :
                       p.SellEndDate.Value.ToShortDateString()
    };
    

    【讨论】:

    • 我完成了这个: var queryable = from p in Products let Date = (p.SellEndDate.Value != null) ? p.SellEndDate.Value.ToShortDateString() : String.Empty select new { SellDate = Date };它有效。
    • 哇,好像是在执行 ToShortDateString 之类的函数时,它转到 SQL 并返回到 c#。
    • 您实际上不需要调用 ToList() - 您只需调用 AsEnumerable()。这足以迫使它使用本地执行。
    • @Jon,调用 ToList 和 AsEnumerable 时执行会有所不同吗?我的意思是 - 它是否获取 1 条记录,来到 c#,调用 ToShort..,返回 SQL 并重复
    • @Jon 是的,我必须承认我不确定 AsEnumerable。 LINQ 可能是如此“迟到”,以至于我经常只是调用 ToList() 来确定。 ;-)
    【解决方案2】:

    ToShortDateString 似乎没有等效的 SQL 翻译。
    请改用ToString

    【讨论】:

      【解决方案3】:

      如果日期时间字段允许为空:

      from order in repository.Order
           select order.OrdShipDate == null ? "" : order.OrdShipDate.GetValueOrDefault(DateTime.Now).Month.ToString() + "/" + order.OrdShipDate.GetValueOrDefault(DateTime.Now).Day.ToString() + "/" + order.OrdShipDate.GetValueOrDefault(DateTime.Now).Year.ToString();
      

      如果日期时间字段不允许空值:

      from order in repository.Order
           select order.OrdShipDate.Month.ToString() + "/" + order.OrdShipDate.Day.ToString() + "/" + order.OrdShipDate.Year.ToString();
      

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 2022-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多