> DefaultIfEmpty is probably top of the features that I'd like to get added.
> I suspect a naive approach won't be too hard, and will probably nail a
large
> %age of use-cases. A full implementation will be, as suggested by Frans,
a
> serious undertaking and I suspect isn't worth the effort. However, as an
> unpaid volunteer, I'm not going to commit to a date for even the naive
> implementation :) I will try my best though!
It might be simpler with re-linq's front end. I was trying it out on
saturday, and I saw this:
query:
[Test]
public void RelinqTest1()
{
using(DataAccessAdapter adapter = new DataAccessAdapter())
{
LinqMetaData metaData = new LinqMetaData(adapter);
var q = from reason in metaData.Reason
join time in
(
from timeHeader in
metaData.NonPresentTimeHeader
where timeHeader.Id == 6
join time in
metaData.NonPresentTime on timeHeader.Id equals time.HeaderId into timeJoin
from joinedTime in
timeJoin.DefaultIfEmpty()
select joinedTime
) on reason.Id equals time.ReasonId
into reasonJoin
from joinedReason in
reasonJoin.DefaultIfEmpty()
select new
{
ReasonID = reason.Id,
Reason = reason.Reason,
HeaderID = joinedReason.HeaderId ??
-1,
TimeID = joinedReason.Id,
Notes = joinedReason.Notes,
DateStart = joinedReason.DateStart,
DateEnd = joinedReason.DateEnd
};
var parser = new QueryParser(new
ExpressionTreeParser(MethodCallExpressionNodeTypeRegistry.CreateDefault()));
var query = parser.GetParsedQuery(q.Expression);
Console.WriteLine(query.ToString());
}
}
Front-end produces:
from ReasonEntity reason in
value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource2`1[AdventureWorks.Dal.Ada
pter.EntityClasses.ReasonEntity])
join NonPresentTimeEntity time in
{
from NonPresentTimeHeaderEntity timeHeader in
value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource2`1[AdventureWorks.Dal.Ada
pter.EntityClasses.NonPresentTimeHeaderEntity])
where ([timeHeader].Id = 6)
join NonPresentTimeEntity time in
value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource2`1[AdventureWorks.Dal.Ada
pter.EntityClasses.NonPresentTimeEntity])
on Convert([timeHeader].Id) equals [time].HeaderId into
IEnumerable`1 timeJoin
from NonPresentTimeEntity joinedTime in
{
[timeJoin] => DefaultIfEmpty()
}
select [joinedTime]
}
on Convert([reason].Id) equals [time].ReasonId into IEnumerable`1
reasonJoin from NonPresentTimeEntity joinedReason in {
[reasonJoin] => DefaultIfEmpty()
}
select new <>f__AnonymousType101`7
(
ReasonID = [reason].Id,
Reason = [reason].Reason,
HeaderID = ([joinedReason].HeaderId ?? -1),
TimeID = [joinedReason].Id,
Notes = [joinedReason].Notes,
DateStart = [joinedReason].DateStart,
DateEnd = [joinedReason].DateEnd
)
Now, as you can see in this snippet:
from NonPresentTimeEntity joinedTime in
{
[timeJoin] => DefaultIfEmpty()
}
the defaultifempty is simply referring to the groupjoin object. What might
be a solution is to add a 'jointype' to the groupjoin class of re-linq and
switch it to 'left join' when you handle the p=>DefaultIfEmpty() construct
of a re-linq tree.
At least that's what I thought of when looking at it. BUt I might overlook
things, haven't looked too deeply into re-linq.
FB
>
>
> On Fri, Aug 20, 2010 at 7:25 AM, Fabio Maulo <[email protected]> wrote:
>
>
> Perhaps.
>
>
> On Fri, Aug 20, 2010 at 2:23 AM, pvginkel <[email protected]>
wrote:
>
>
> OK, this went a little bit off topic. Anyway, to get back to
> the
> subject, I was wondering whether you agree this is a crucial
> feature
> of the Linq provider. Maybe I'm missing the obvious, but I
do
> not see
> a different way to get outer joins to work via Linq. I would
> offer to
> pick this up would it not be that the initial reply kind of
> scared me
> away :).
>
> In short, can we expect to get outer joins via Linq working
in
> the GA?
>
>
> On Aug 19, 9:47 pm, Fabio Maulo <[email protected]>
wrote:
> > Ok.
> >
> > P.S. perhaps somebody will implements a fix... perhaps.
> >
> >
> >
> >
> >
>
> > On Thu, Aug 19, 2010 at 3:30 PM, Frans Bouma <[email protected]>
> wrote:
> > > > about this " it ends up with you talking me down in
some
> form or the
> > > other"
> > > > I don't know what you are talking about.
> >
> > > To help you, think REALLY HARD about the
> following:
> > > Why did you reply with 3 emails to my post, only
replying
> on my first
> > > sentence, as if I would imply anything with it instead
of
> exactly what I
> > > said. Why did you think that of me?
> >
> > > For the record, the only one who replied with any
> real info to the
> > > topicstarter was... who? I really don't know why you had
> to do this, I
> > > really don't.
> >
> > > FB
> >
> > > > For others matter: Ok.
> >
>
> > > > On Thu, Aug 19, 2010 at 2:00 PM, Frans Bouma
> <[email protected]> wrote:
> >
> > > > > I saw that you tried to be helpful in the
other
> part of your
> > > mail.
> >
> > > > I tried to be helpful in EVERY email here
> and on nhusers,
> > > and
> > > > I
> > > > didn't want to imply *anything* in the 1st
> sentence I wrote. WTF is
> > > > your
> > > > problem?
> >
> > > > > What we have notice is that there is a kind of
> "personal
> > > questions"
> > > > when
> > > > we
> > > > > are talking about our linq-provider and we
don't
> have a
> > > > "personalized
> > > > > customer service" (at least not for free).
> >
> > > > I have no idea what you mean/refer to.
> >
> > > > > Steve is part of NH's team and the Linq
provider
> is part of
> > > > NHibernate
> > > > core.
> > > > > As any other issue, even the issues related to
> linq-provider are
> > > > solved by
> > > > > the team.
> >
> > > > > Perhaps, with his silence, Steve and the team
> altogether are
> > > trying
> > > > to say
> > > > > the same.
> >
> > > > Sorry but I have no idea what you mean,
but
> anyway, it's
> > > been
> > > > enough. Every f*cking time 'Linq' is mentioned
and
> I reply in some
> > > > form or
> > > > another, it ends up with you talking me down in
> some form or the
> > > > other. I
> > > > just try to be helpful, but I don't need this
kind
> of bickering. If
> > > > helping
> > > > out time after time ends up with some form of
> bickering, I won't
> > > > spend my
> > > > time on it anymore. Like I've said to Steve
> before, he can email me
> > > > any time
> > > > with questions about Linq and how to do things,
> but I won't reply
> > > to
> > > > linq
> > > > crap here again, as apparently you don't want my
> help/information
> > > > about how
> > > > to deal with linq expressions and what to
expect.
> In case you don't
> > > > know,
> > > > mr. Maulo, that info is no-where to be found on
> the net nor in MS'
> > > > documentation. Only the small group on this
planet
> who have dealt
> > > > with these
> > > > miserable issues before know what to expect and
> where a solution
> > > > 'might' be
> > > > found (as the only team who managed to get it
all
> right is the Linq
> > > > to Sql
> > > > team (now abandoned) and they didn't publish any
> of their info).
> >
> > > > FB
> >
> > > > > P.S. I'm a "little bit" more loquacious in
some
> cases
> >
>
> > > > > On Thu, Aug 19, 2010 at 11:54 AM, Frans Bouma
> <[email protected]>
>
> > > wrote:
> >
> > > > > > On Thu, Aug 19, 2010 at 7:20 AM, Frans
> Bouma <
>
> > > [email protected]>
>
> > > > wrote:
> >
> > > > > > I don't know if Steve's still
> reading this list,
> >
> > > > > > What do you mean ?
> >
> > > > > Well, I asked in some other linq
> thread a couple of
> > > > questions
> > > > > to
> > > > > Steve, gave info about how to do things,
> but never got a
> > > > reply (was
> > > > > in June
> > > > > or so), also all other linq related
> material is not
> > > answered
> > > > by him,
> > > > > so I
> > > > > wondered if he was still reading this
> list. I don't know
> > > how
> > > > else to
> > > > > interpret this remark, to be honest.
> >
> > > > > But that aside, sorry I tried to
be
> helpful, mr.
> > > > Maulo.
> >
> > > > > FB
> >
> > > > > --
> > > > > Fabio Maulo
> >
> > > > --
> > > > Fabio Maulo
> >
> > --
> > Fabio Maulo
>
>
>
>
> --
> Fabio Maulo
>
>
>