Linq to entities if in select 语句
Linq to entities if in select statement
我有这个 linq 查询
Dim chiamateAperte = From statoRic In
dbVulcano.StatoRic.Where(Function(s) s.RFStato >= 11 And s.RFStato <= 13 And s.Attuale = 1 And s.RFTecnico = rfTecnico)
From richiesta In
dbVulcano.Richieste.Where(Function(r) r.IDRic = statoRic.RFRic).DefaultIfEmpty()
From cliente In
dbVulcano.Clienti.Where(Function(c) c.IDCliente = richiesta.RFCliente).DefaultIfEmpty()
Select statoRic.ID, statoRic.RFRic, statoRic.RFStato, statoRic.Attuale, richiesta.Descr, cliente.RagSociale, statoRic.DataAss, statoRic.Data, dataf = If(statoRic.DataAss.HasValue, statoRic.DataAss, statoRic.Data), statoRic.OraDalle, statoRic.OraAlle
Order By dataf Descending, statoRic.OraDalle Ascending
它工作正常,但我想在 "OraDalle" 字段上添加一个订单条件。
OraDalle 它是一种时间字段,但遗憾的是在 db 上它被定义为 smallInt(我无法更改它),因此格式类似于“800”表示 "eight o'clock"。该字段可以为空。
所以我尝试了这个而不是statoRic.OraDalle:
orad=if (statoRic.OraDalle.HasValue,statoRic.OraDalle,2359)
然后
Order By dataf Descending, orad Ascending
但它会抛出一个丑陋的错误:无法将系统可空 1 转换为 'system.nullable' 类型的系统对象。此上下文仅支持基本类型或枚举类型
然后我试了这个:
orad=statoRic.OraDalle.GetValueOrDefault(2359)
但它也会抛出如下错误:linq to entities does not recognize the method 'Int16 GetValueOrDefault(Int16)'
所以...我怎样才能实现我想要的?这整个混乱是为了获得按时间排序的列表,其中空时间值位于底部(而不是顶部,默认情况下)。谢谢大家!
而不是 if (statoRic.OraDalle.HasValue,statoRic.OraDalle,2359)
使用 if (statoRic.OraDalle,2359)
这相当于 C# 的 null-coalescing-operator ??
:
statoRic.OraDalle ?? 2359
这是 similar question.
的解决方案
我有这个 linq 查询
Dim chiamateAperte = From statoRic In
dbVulcano.StatoRic.Where(Function(s) s.RFStato >= 11 And s.RFStato <= 13 And s.Attuale = 1 And s.RFTecnico = rfTecnico)
From richiesta In
dbVulcano.Richieste.Where(Function(r) r.IDRic = statoRic.RFRic).DefaultIfEmpty()
From cliente In
dbVulcano.Clienti.Where(Function(c) c.IDCliente = richiesta.RFCliente).DefaultIfEmpty()
Select statoRic.ID, statoRic.RFRic, statoRic.RFStato, statoRic.Attuale, richiesta.Descr, cliente.RagSociale, statoRic.DataAss, statoRic.Data, dataf = If(statoRic.DataAss.HasValue, statoRic.DataAss, statoRic.Data), statoRic.OraDalle, statoRic.OraAlle
Order By dataf Descending, statoRic.OraDalle Ascending
它工作正常,但我想在 "OraDalle" 字段上添加一个订单条件。 OraDalle 它是一种时间字段,但遗憾的是在 db 上它被定义为 smallInt(我无法更改它),因此格式类似于“800”表示 "eight o'clock"。该字段可以为空。 所以我尝试了这个而不是statoRic.OraDalle:
orad=if (statoRic.OraDalle.HasValue,statoRic.OraDalle,2359)
然后
Order By dataf Descending, orad Ascending
但它会抛出一个丑陋的错误:无法将系统可空 1 转换为 'system.nullable' 类型的系统对象。此上下文仅支持基本类型或枚举类型
然后我试了这个:
orad=statoRic.OraDalle.GetValueOrDefault(2359)
但它也会抛出如下错误:linq to entities does not recognize the method 'Int16 GetValueOrDefault(Int16)'
所以...我怎样才能实现我想要的?这整个混乱是为了获得按时间排序的列表,其中空时间值位于底部(而不是顶部,默认情况下)。谢谢大家!
而不是 if (statoRic.OraDalle.HasValue,statoRic.OraDalle,2359)
使用 if (statoRic.OraDalle,2359)
这相当于 C# 的 null-coalescing-operator ??
:
statoRic.OraDalle ?? 2359
这是 similar question.