【问题标题】:Qbject.Equal in Linq to Entity Where Statement Not WorkingLinq 中的 Qbject.Equal 到语句不起作用的实体
【发布时间】:2018-09-26 13:52:43
【问题描述】:

我正在尝试使用Object.Equal() 使用现有对象进行查询。

例如 假设我有一个名为Term 的类。

我已经创建了下面的对象。

var term = new Term() {Code = "Plant - weed variety" };

此外,在课堂术语中,我将Equals 方法重写为如下:

public override bool Equals(object obj)
{
    return Equals(obj as Term);
}

private bool Equals(Term t)
{
    return t != null && t.Code == Code;
}

但是当我执行下面的代码时它返回 null。

var dbTerm = context.Term.Where(t => t.Equals(term));

当我查看SQL Profiler时,我发现在SQL端执行的查询是:

exec sp_executesql N'SELECT TOP(1) [c].[pk], [c].[code], [c].[created_by], [c].[creation_date], [c].[description], [c].[hash_code], [c].[id], [c].[last_updated_by], [c].[last_updated_date], [c].[legacy_id_from_source], [c].[name], [c].[scope_pk], [c].[status_pk], [c].[vocabulary_pk]
FROM [term] AS [c]
WHERE @__term_0_Pk = [c].[pk]',N'@__term_0_Pk bigint',@__term_0_Pk=0

问题是:为什么查询被翻译成使用PK 而不是代码的地方?

谢谢

【问题讨论】:

  • 因为 Entity Framework 忽略了您的 Equals 以生成 SQL。您可能想使用var code = term.Code; var dbTerm = context.Term.Where(t => t.Code == code);
  • 只是添加到@mjwills 的评论中,看来这种行为将在 EF7 (blogs.msdn.microsoft.com/adonet/2014/10/27/ef7-v1-or-v7) 中发生变化

标签: c# .net entity-framework linq


【解决方案1】:

为什么查询被翻译成使用 PK 而不是代码的地方?

Entity Framework 只知道您在 Where 子句中调用 object.Equals 方法。 Linq 表达式不提供对从其内部调用的方法的实际实现的任何可见性。当 Entity Framework 尝试将该表达式树转换为 SQL 查询时,它必须假设调用 object.Equals 的含义,它假设这是一个主键比较。

您需要将比较对象的方式放入 Where() 调用中的实际表达式中。即。

var dbTerm = context.Term.Where(t => t.Code == term.Code);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多