Reputation: 313
I am going to trash Entity Framework 5! I have spent two days to find solution from web but found nothing!
I tried a simple left join from table Artworks and EndValidities with the input IDFondazione as 2620
var query = from art in db.Artworks
join endVal in db.EndValidities.DefaultIfEmpty()
on art.ID_Dtsl equals endVal.IDdtsl
where art.ID_Cdgs == IDFondazione
select new SchedaOpera()
{
Cdscheda = art.Cdscheda,
Confirmed = art.FGconfermata,
DSimmagine = art.DSimmgine,
Dtsf = art.Dtsf,
Dtsi = art.Dtsi,
Dtsl = endVal != null ? endVal.Dtsl : "",
Iscr = art.Iscr,
Misa = art.Misa,
Ldcn = art.Ldcn,
Ldcs = art.Ldcs,
Misd = art.Misd,
Misl = art.Misl,
Misn = art.Misn,
Misp = art.Misp,
Miss = art.Miss,
Pvcc = art.Pvcc,
Pvcp = art.Pvcp,
Sgtt = art.Sgtt
};
The marvellous entity framework continues to produce
SELECT [Extent1].[ID_Dtsl] AS [ID_Dtsl], [Extent1].[CDscheda] AS [CDscheda],
[Extent1].[FGconfermata] AS [FGconfermata],
[Extent1].[DSimmagine] AS [DSimmagine],
[Extent1].[DS_DTSF] AS [DS_DTSF],
[Extent1].[DS_DTSI] AS [DS_DTSI],
CASE WHEN (cast(1 as bit) <> cast(0 as bit)) THEN [Extent2].[DSdtsl] ELSE N'_' END AS [C1],
[Extent1].[DS_ISCR] AS [DS_ISCR],
[Extent1].[NR_MISA] AS [NR_MISA],
[Extent1].[DS_LDCN] AS [DS_LDCN],
[Extent1].[DS_LDCS] AS [DS_LDCS],
[Extent1].[NR_MISD] AS [NR_MISD],
[Extent1].[NR_MISL] AS [NR_MISL],
[Extent1].[NR_MISN] AS [NR_MISN],
[Extent1].[NR_MISP] AS [NR_MISP],
[Extent1].[NR_MISS] AS [NR_MISS],
[Extent1].[FGpubblicata] AS [FGpubblicata],
[Extent1].[DS_PVCC] AS [DS_PVCC],
[Extent1].[DS_PVCP] AS [DS_PVCP],
[Extent1].[DS_SGTT] AS [DS_SGTT]
FROM [dbo].[TPD_OPERE] AS [Extent1]
INNER JOIN [dbo].[TSA_DTSL] AS [Extent2] ON [Extent1].[ID_Dtsl] = [Extent2].[IDdtsl]
WHERE [Extent1].[CD_CDGS] = '2620'
Upvotes: 1
Views: 6343
Reputation: 908
I have this working code:-
var res = from et in db.entity_test join en in db.entity_new on et.id equals en.id into ps from en in ps.DefaultIfEmpty() select new {Name = et.name,Email=en.email };
GridView1.DataSource = res;
GridView1.DataBind();
Upvotes: 0
Reputation: 29
My Demo, tested in linqpad, you can left outer join two tables as below:
var resultAcctInfo = (
from p in Focus_Person
where String.Compare(p.Login, "yourname", true) == 0 && (p.AcctStatusID == 1 || p.AcctStatusID == 2)
join an in Focus_SecurityAnswer on p.PersonID equals an.PersonID into G
//from g in G //You can uncommented this line to check the difference.
join q in Focus_SecurityQuestion on G.FirstOrDefault().QuestionID equals q.QuestionID into Q //left join question table
//from q in Q
select new
{
Person = p,
Answer = G.FirstOrDefault(),
//Question = q,
});
resultAcctInfo.Dump();
Upvotes: 1
Reputation: 109079
DefaultIfEmpty
in Entity Framework only works on navigation properties. Otherwise you should use GroupJoin
, which in comprehensive syntax is achieved by join
... into
. See this excellent post for more details.
So your query could be (GroupJoin):
from art in db.Artworks
join endVal in db.EndValidities on art.ID_Dtsl equals endVal.IDdtsl
into g // can be any name
where art.ID_Cdgs == IDFondazione
...
The difference is the statement selects art
objects and a collection of endVal
objects per art
object. So the Dtsl
property should be a Select
on endVal.Dtsl
, producing a collection of Dtsl
values. The collection can be empty (zero elements), which represents the outer join.
Or, if there is navigation property Artwork.EndValidities
:
from art in db.Artworks
from endVal in art.EndValidities.DefaultIfEmpty()
...
Upvotes: 2
Reputation: 60493
from art in db.Artworks
join endValidities in db.EndValidities
on art.ID_Dtsl equals endValidities .IDdtsl into ev
where art.ID_Cdgs == IDFondazione
from endVal in ev.DefaultIfEmpty()
select new SchedaOpera()
{
Cdscheda = art.Cdscheda,
Confirmed = art.FGconfermata,
DSimmagine = art.DSimmgine,
Dtsf = art.Dtsf,
Dtsi = art.Dtsi,
Dtsl = endVal.Dtsl ?? string.Empty,
Iscr = art.Iscr,
Misa = art.Misa,
Ldcn = art.Ldcn,
Ldcs = art.Ldcs,
Misd = art.Misd,
Misl = art.Misl,
Misn = art.Misn,
Misp = art.Misp,
Miss = art.Miss,
Pvcc = art.Pvcc,
Pvcp = art.Pvcp,
Sgtt = art.Sgtt
};
Upvotes: 0