如果在select语句中Linq到实体

时间:2016-10-25 06:53:55

标签: sql vb.net entity-framework linq linq-to-entities

我有这个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”一样说“八点钟”。该字段可以为null。 所以我试过这个:而不是statoRic.OraDalle:

orad=if (statoRic.OraDalle.HasValue,statoRic.OraDalle,2359)

然后

Order By dataf Descending, orad Ascending

但是它抛出了一个丑陋的错误:无法将系统nullable 1转换为'system.nullable'类型的系统对象。此上下文仅支持原始类型或枚举类型

然后我尝试了这个:

orad=statoRic.OraDalle.GetValueOrDefault(2359)

但它也会抛出一个错误:linq to entities无法识别方法'Int16 GetValueOrDefault(Int16)'

那么......我怎样才能实现我的目标?这整个混乱是为了获得按时间排序的列表,其中空时间值在底部(而不是在顶部,默认情况下)。谢谢大家!

1 个答案:

答案 0 :(得分:0)

而不是if (statoRic.OraDalle.HasValue,statoRic.OraDalle,2359)使用if (statoRic.OraDalle,2359)

这相当于C#的null-coalescing-operator ??statoRic.OraDalle ?? 2359这是similar question的解决方案。