【问题标题】:Check Nullable for object insde LinQ to Sql code检查 Nullable 对象 insde LinQ to Sql 代码
【发布时间】:2020-02-09 22:05:19
【问题描述】:

我正在使用这个示例 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),因为当它们为空时,我没有所有记录,但我也没有任何错误。

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    您可以在每次加入后使用“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
             });
    

    【讨论】:

    • 也为了您的建议,我想告诉您我的情况与您在我的代码中看到的不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多