c# - 检查 Nullable 对象 insde LinQ to Sql 代码
问题描述
我正在使用这个示例 Linq 代码:
from objpath in _context.PathModel
join objOriginalStation in _context.StationModel
on objpath.IdStazioneOrigine equals objOriginalStation.IDStazione
join objDesttinationStation in _context.StationModel
on objpath.IdStazioneDestinazione equals objDesttinationStation.IDStazione
join objVia1Station in _context.StationModel
on objpath.IdVia1 equals objVia1Station.IDStazione
join objVia2Station in _context.StationModel
on objpath.IdVia2 equals objVia2Station.IDStazione
select new NewPercorsiModel
{
IdPercorso = objpath.IdPercorso,
IdSottorete = objpath.IdSottorete,
Distanza = objpath.Distanza,
IdStazioneDestinazione = objpath.IdStazioneDestinazione,
IdStazioneOrigine = objpath.IdStazioneDestinazione,
IdVia1 = objpath.IdVia1,
IdVia2 = objpath.IdVia2,
Versione = objpath.Versione ?? string.Empty,
StazioneOrigineName = objOriginalStation.NomeStazione,
StazioneDestinazioneName = objDesttinationStation.NomeStazione,
Via1Name = objVia1Station.NomeStazione,
Via2Name = objVia2Station.NomeStazione ?? string.Empty
};
首先我的问题是,我有更好的解决方案来改进我的代码吗?
第二个也是重要的问题是我如何检查我的对象的可空性(例如objVia2Station),因为当它们为空时,我没有所有记录,但我也没有任何错误。
解决方案
您可以在每次加入后使用“DefaultIfEmpty()”,如下所示
from objpath in _context.PathModel
join objOriginalStation in _context.StationModel
on objpath.IdStazioneOrigine equals objOriginalStation.IDStazione into object1
from Ob1 in object1.DefaultIfEmpty()
join objDesttinationStation in _context.StationModel
on objpath.IdStazioneDestinazione equals objDesttinationStation.IDStazione into object2
from Ob2 in object2.DefaultIfEmpty()
join objVia1Station in _context.StationModel
on objpath.IdVia1 equals objVia1Station.IDStazione into object3
from Ob3 in object3.DefaultIfEmpty()
join objVia2Station in _context.StationModel
on objpath.IdVia2 equals objVia2Station.IDStazione into object4
from Ob4 in object4.DefaultIfEmpty()
select new NewPercorsiModel
{
IdPercorso = objpath.IdPercorso,
IdSottorete = objpath.IdSottorete,
Distanza = objpath.Distanza,
IdStazioneDestinazione = objpath.IdStazioneDestinazione,
IdStazioneOrigine = objpath.IdStazioneDestinazione,
IdVia1 = objpath.IdVia1,
IdVia2 = objpath.IdVia2,
Versione = Ob1.Versione ,
StazioneOrigineName = objOriginalStation.NomeStazione,
StazioneDestinazioneName = objDesttinationStation.NomeStazione,
Via1Name = objVia1Station.NomeStazione,
Via2Name = Ob4.NomeStazione
};
这段代码相当于“Left Outer Join”,但我不喜欢它,因为我们可以在实体框架中使用继承策略你应该在遇到另一个表时开始接收数据。像这样:
var query = context.BaseTable.Select(x => new
{
x.Id,
x.field1,
x.field2,
..
..
alias_name= x.ForeignTable== null ? "" : x.ForeignTable.Name
});
推荐阅读
- amazon-web-services - Gremlin 查询中的减法 (AWS Neptune)
- django - Nginx 基础认证
- teamsql - TeamSQL 的代理设置
- asp.net - JSON.parse 错误:项目发布后出现意外字符
- python-3.x - 使用 Python 请求对 DockerHub 进行 JWT 令牌身份验证
- jquery - jQuery 显示和淡入
- regex - 检查位数的正则表达式
- python - 子图中的自定义 xtick 标签
- spring-boot - Spring Boot 在服务中运行相同配置文件的多个实例
- python - Python - 记录字符串以前的内容