Linq错误:InvalidOperationException:无法转换表达式

Linq错误:InvalidOperationException:无法转换表达式,linq,Linq,从DateTime列中获取值 如果为null,则返回String.Empty 其他的 DateTime.ToShortDateString 我做错了什么=>下面生成的查询: var queryable = from p in Products select new { selldate = p.SellEndDate == null ? string.Empty

从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:无法转换表达式'TableProduct.Selectp=>new f_uuAnonymousType01SellDate=IIFp.SellEndDate=null,InvokevalueSystem.Func1[System.String],p.SellEndDate.Value.ToShortDateString'转换为SQL,无法将其视为本地表达式。

这里发生的基本情况是,LINQ to SQL正在将整个查询转换为SQL Server可以理解的内容。但问题是SQL Server没有DateTime.ToSortDateString的概念,因此转换为SQL失败

您必须更改查询,以便它只选择SellEndDate,这将使其成为可为null的,然后当您使用该查询的结果时,可以将其转换为字符串。例如:

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()
};
ToSortDateString似乎没有等效的SQL转换。
改为使用ToString。

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

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();

我这样做是因为:var queryable=from p in Products let Date=p.SellEndDate.Value!=无效的p、 SellEndDate.Value.ToShortDateString:String.Empty选择新建{SellDate=Date};它可以工作。哇,它看起来像是转到了SQL,当执行像ToSortDateString这样的函数时又回到了c。你真的不需要调用ToList,你只需要调用一个numerable。这足以迫使它使用本地执行。@Jon,当ToList被称为vs AsEnumerable时,执行是否会有所不同?我的意思是-它是否获取1条记录,来到c,调用ToShort..,返回SQL并repeat@Jon是的,我必须承认我不确定一个数字。林克有时会迟到,我经常打电话给托利斯来确认一下-