LINQ to Entities does not recognize the method

前端 未结 3 1696
遇见更好的自我
遇见更好的自我 2020-11-22 00:40

I\'m getting the following error when trying to do a linq query:

LINQ to Entities does not recognize the method \'Boolean IsCharityMatching(System.S

相关标签:
3条回答
  • 2020-11-22 01:31

    As you've figured out, Entity Framework can't actually run your C# code as part of its query. It has to be able to convert the query to an actual SQL statement. In order for that to work, you will have to restructure your query expression into an expression that Entity Framework can handle.

    public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
    {
        string name = this.charityName;
        string referenceNumber = this.referenceNumber;
        return p => 
            (string.IsNullOrEmpty(name) || 
                p.registeredName.ToLower().Contains(name.ToLower()) ||
                p.alias.ToLower().Contains(name.ToLower()) ||
                p.charityId.ToLower().Contains(name.ToLower())) &&
            (string.IsNullOrEmpty(referenceNumber) ||
                p.charityReference.ToLower().Contains(referenceNumber.ToLower()));
    }
    
    0 讨论(0)
  • 2020-11-22 01:34

    I got the same error in this code:

     var articulos_en_almacen = xx.IV00102.Where(iv => alm_x_suc.Exists(axs => axs.almacen == iv.LOCNCODE.Trim())).Select(iv => iv.ITEMNMBR.Trim()).ToList();
    

    this was the exactly error:

    System.NotSupportedException: 'LINQ to Entities does not recognize the method 'Boolean Exists(System.Predicate`1[conector_gp.Models.almacenes_por_sucursal])' method, and this method cannot be translated into a store expression.'

    I solved this way:

    var articulos_en_almacen = xx.IV00102.ToList().Where(iv => alm_x_suc.Exists(axs => axs.almacen == iv.LOCNCODE.Trim())).Select(iv => iv.ITEMNMBR.Trim()).ToList();
    

    I added a .ToList() before my table, this decouple the Entity and linq code, and avoid my next linq expression be translated

    NOTE: this solution isn't optimal, because avoid entity filtering, and simply loads all table into memory

    0 讨论(0)
  • 2020-11-22 01:37

    If anyone is looking for a VB.Net answer (as I was initially), here it is:

    Public Function IsSatisfied() As Expression(Of Func(Of Charity, String, String, Boolean))
    
    Return Function(charity, name, referenceNumber) (String.IsNullOrWhiteSpace(name) Or
                                                             charity.registeredName.ToLower().Contains(name.ToLower()) Or
                                                             charity.alias.ToLower().Contains(name.ToLower()) Or
                                                             charity.charityId.ToLower().Contains(name.ToLower())) And
                                                        (String.IsNullOrEmpty(referenceNumber) Or
                                                         charity.charityReference.ToLower().Contains(referenceNumber.ToLower()))
    End Function
    
    0 讨论(0)
提交回复
热议问题