Join using multiple values in Linq Dynamic Core

c# entity-framework-core linq


I am using Linq.Dynamic.Core to dynamically create queries for EF Core and I got stuck in the join operation with multiple primary keys. With single primary key tables everything works perfectly.

As a first step, I created an example query in standard Linq:

        var resultLinq = ctx.Set<Destination>()
                p => new  { A1 = p.Id, A2 = p.DestinationId }, 
                j => new { A1 = j.Id, A2 = j.DestinationId }, 
                (p, j) => new { Description = p.Description, Collection_Descr = j.Description })

And then I translated it into Dynamic Linq Core as a model:

        var resultDynamicLinq = ctx.Set<Destination>()
           "new { it.Id AS A1, it.DestinationId AS A2 }", 
           "new { Id AS A1, DestinationId AS A2}",
           "new { outer.Description AS Description, inner.Description AS Collection_Descr}")

Linq query works, instead Dynamic Linq query returns this exception:

       System.InvalidOperationException: The LINQ expression 'DbSet<Destination>
            outer: DbSet<DestinationCollectionInfo>, 
            inner: d => new <>f__AnonymousType2<int, int>{ 
                A1 = d.Id, 
                A2 = d.DestinationId 
            outerKeySelector: d0 => new <>f__AnonymousType2<int, int>{ 
                A1 = d0.Id, 
                A2 = d0.DestinationId 
            innerKeySelector: (d, d0) => new TransparentIdentifier<Destination, DestinationCollectionInfo>(
                Outer = d, 
                Inner = d0
            ))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See for more information.

Am I doing something wrong or are there limitations in Dynamic Linq? Thank you!

3/13/2020 11:56:34 AM

Accepted Answer

You are doing nothing wrong. But looks like EF Core has some specific query expression requirements which are different from "defaults", so you should use the Dynamic LINQ method overloads having ParsingConfig config argument and pass ParsingConfig.DefaultEFCore21, e.g.

.Join(ParsingConfig.DefaultEFCore21, ctx.Set<DestinationCollectionInfo>(),

The overloads without config simply pass ParsingConfig.Default. Ideally ParsingConfig.Default property would have been settable, so one can set it once to ParsingConfig.DefaultEFCore21 and then use the regular overloads. But unfortunately it is read only, so as mentioned at the beginning you have to pass that argument explicitly.

3/13/2020 1:43:19 PM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow