When I upgrade the project from .NET Core 2.2 to .NET Core 3.1, LINQ doesn't work.

These are my entity models:

public class Offer
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Desc { get; set; }
}

public class VendorOfferMembershipScheme
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Guid OfferId { get; set; }
}

When I try to get data using Linq with this code:

var data = (from offer in _dbContext.Offers
            join membershipscheme in _dbContext.VendorOfferMembershipSchemas on offer.Id equals membershipscheme.OfferId into ms
            from membershipscheme in ms.DefaultIfEmpty()
            select (prepareOfferData((membershipscheme == null ? null : membershipscheme), offer))).ToList();

I get an error:

Processing of the LINQ expression 'DbSet\n .GroupJoin(\n outer: DbSet, \n inner: offer => offer.Id, \n outerKeySelector: membershipscheme => membershipscheme.OfferId, \n innerKeySelector: (offer, ms) => new { \n offer = offer, \n ms = ms\n })' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.

But it works fine in .NET Core 2.2.

2

There are 2 best solutions below

1
On

When I upgrade the project from .NET Core 2.2 to .NET Core 3.1, LINQ doesn't work. Can you try this ;

var data = _dbContext.Offers
    .GroupJoin(
        _dbContext.VendorOfferMembershipSchemas,
        offer => offer.Id,
        membershipscheme => membershipscheme.OfferId,
        (offer, ms) => new { Offer = offer, MembershipSchemes = ms })
    .SelectMany(
        x => x.MembershipSchemes.DefaultIfEmpty(),
        (offer, membershipscheme) => prepareOfferData(membershipscheme, offer.Offer))
    .ToList();
2
On

You can manually switch to client side evaluation:

var data = (from offer in _dbContext.Offers
            join membershipscheme in _dbContext.VendorOfferMembershipSchemas on offer.Id equals membershipscheme.OfferId into ms
            from membershipscheme in ms.DefaultIfEmpty()
            select new { membershipscheme, offer })
            .AsEnumerable()
            .Select(mo => prepareOfferData(mo.membershipscheme, mo.offer))
            .ToList();

You can also use query syntax, but I don't find nested query syntax particularly readable:

var data = (from mo in
                (from offer in _dbContext.Offers
                 join membershipscheme in _dbContext.VendorOfferMembershipSchemas on offer.Id equals membershipscheme.OfferId into ms
                 from membershipscheme in ms.DefaultIfEmpty()
                 select new { membershipscheme, offer }).AsEnumerable()
            select prepareOfferData(mo.membershipscheme, mo.offer))
            .ToList();