2

I get an error when I try to run the following query in LINQ to Entities:

public IEnumerable TestOne2()
{
    var query = this.Context.CmnAddressCities
        .Join(this.Context.CmnAddressStates, 
              p => p.StateID, q => q.StateID, 
              (p, q) => SelectSearchColumns)
        .ToList();

     return query;
}

public Expression<Func<CmnAddressCity,CmnAddressState, dynamic>>
    SelectSearchColumns = (e,r) => new
        {
            CityID = e.CityID,
            CityName = e.CityName,
            StateName=r.StateName,
        };

Error Message:

The LINQ expression node type 'Lambda' is not supported in LINQ to Entities.

I would like to know why this error arise and how to solve this.

vvvvv
  • 25,404
  • 19
  • 49
  • 81
shamim
  • 6,640
  • 20
  • 85
  • 151

3 Answers3

3

The following should work:

var query = this.Context.CmnAddressCities
                .Join(this.Context.CmnAddressStates, 
                      p => p.StateID, 
                      q => q.StateID, 
                      SelectSearchColumns)
                .ToList();

See the second to last line for the difference. Your version creates an expression that returns an expression. The EF provider can't translate that to SQL, what is the equivalence of an expression in SQL? That doesn't exist.
You simply have to pass your expression as the parameter itself.

Daniel Hilgarth
  • 171,043
  • 40
  • 335
  • 443
2

This expression

(p, q) => SelectSearchColumns

is an expression that returns an expression. Try changing it to SelectSearchColumns on its own.

Tim Rogers
  • 21,297
  • 6
  • 52
  • 68
2

In the expression (p, q) => SelectSearchColumns you are passing SelectSearchColumns to the Join method instead of calling it. The query provider then fails to translate it into an SQL statement, because it is passed as a data, rather than being interpreted as a call.

You need either

.Join(this.Context.CmnAddressStates, 
     p => p.StateID, 
     q => q.StateID, 
     (p, q) => SelectSearchColumns(p, q))

or the short version

.Join(this.Context.CmnAddressStates, 
     p => p.StateID, 
     q => q.StateID, 
     SelectSearchColumns)
Honza Brestan
  • 10,637
  • 2
  • 32
  • 43