Qbject.Equal в Linq to Entity, где не работает инструкция - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь использовать 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;
}

Но когда я выполняю приведенный ниже фрагмент кода, он возвращает ноль.

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 вместо кода?

Спасибо

1 Ответ

0 голосов
/ 26 сентября 2018

почему запрос переводится в местоположение, использующее PK вместо кода?

Entity Framework знает только, что вы вызываете метод object.Equals внутри предложения Where.Выражения Linq не предоставляют никакой информации о реальной реализации метода, который вызывается изнутри.Когда Entity Framework пытается преобразовать это дерево выражений в SQL-запрос, он должен сделать предположение о том, что подразумевается под вызовом object.Equals, который, как предполагается, является сравнением первичного ключа.

Вам нужно будет указать, как вы сравниваете объекты, с фактическим выражением в вызове Where ().IE

var dbTerm = context.Term.Where(t => t.Code == term.Code);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...