0

I am using this example Linq code:

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
    };

First of all my question is that, have I a better solution to improve my code?

and second and important my question is that how could I check nullable for my objects(for example for objVia2Station) because when they are null I don't have all my records but I don't have any error also.

1 Answer 1

1

you can use "DefaultIfEmpty()" after each join like this code

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  
};

this code in equal to "Left Outer Join", But I don't like it because we can use Inheritance Strategy in Entity Framework You should start receiving data when you encounter another table. like this:

var query = context.BaseTable.Select(x => new
         {
          x.Id,
          x.field1,
          x.field2,
          ..
          ..
          alias_name= x.ForeignTable== null ? "" : x.ForeignTable.Name
         });
Sign up to request clarification or add additional context in comments.

1 Comment

also for your suggestion, I want to tell that my situation is different as you see in my code.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.