2

我写了这个声明:

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

看不到出现以下错误的原因:

LINQ to Entities 无法识别“Boolean Contains[Customer](System.Linq.IQueryable 1[DBInteractor.Customer], DBInteractor.Customer, System.Collections.Generic.IEqualityComparer1[DBInteractor.Customer])”方法,并且该方法无法转换为存储表达式。

我创建了一个参考:

  IEqualityComparer<Customer> customerCompairor = new PMKeyCompairor();

并且 PMKeyCompairor 正在实施IEqualityComparer<Customer>

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

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

那么我哪里错了?

4

1 回答 1

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))
于 2013-07-01T12:55:24.770 回答