LINQ to Entities无法识别方法'Boolean Contains

时间:2013-07-01 12:46:52

标签: .net c#-4.0 iequalitycomparer

我写了这句话:

if (!db.Customers.Contains<Customer>(customer,customerCompairor))
                {
                    db.Customers.Add(customer);
                }

看不出为什么会出现以下错误:

  

LINQ to Entities无法识别该方法    'Boolean包含[Customer](System.Linq.IQueryable 1[DBInteractor.Customer], DBInteractor.Customer, System.Collections.Generic.IEqualityComparer 1 [DBInteractor.Customer])'方法,此方法无法转换为商店表达式。

我创建了一个参考:

  IEqualityComparer<Customer> customerCompairor = new PMKeyCompairor();

和PMKeyCompairor正在实施IEqualityComparer<Customer>

class PMKeyCompairor:IEqualityComparer<Customer>
    {
            ........................
            .............................
     }

客户有一个扩展方法Contains(返回bool),因为它是DbSet

那我哪里错了?

1 个答案:

答案 0 :(得分:9)

Linq to Entities查询被转换为SQL,但无法将自定义比较器的逻辑转换为SQL,因此必须在内存中进行比较。你可以做类似的事情:

if (!db.Customers.AsEnumerable().Contains<Customer>(customer,customerCompairor))

但它会将每个客户加载到内存中,然后再将其与customer变量进行比较,这可能不是一个好主意......

如果可以,尝试将比较逻辑表示为内联Linq表达式,例如:

if (!db.Customers.Any(c => c.Id == customer.Id && c.Name == customer.Name))