Подтвердить что ты не робот

В этом контексте поддерживаются только примитивные типы или типы перечислений

Я видел много вопросов по этой теме, но я не смог разобраться ни с одним из них, который действительно решает проблему, которую я вижу. У меня есть объект деятельности, который отслеживает, какой сотрудник назначен, а также какой сотрудник создал запись и обновил ее. Если я удалю строку кода `where a.AssignedEmployee == currentUser ', я не получу ошибку времени выполнения ниже.

Невозможно создать постоянное значение типа 'DataModels.Employee'. Только в этом контексте поддерживаются примитивные типы или типы перечислений.

CONTROLLER

var query = from a in db.Activities
            where a.AssignedEmployee == currentUser
            where a.IsComplete == false
            orderby a.DueDate
            select a;
return View(query.ToList());

VIEW

@model IEnumerable<Data.DataModels.Activity>
..........
4b9b3361

Ответ 1

Я предполагаю, что ошибка указывает на то, что EF не может перевести оператор равенства для Employee в SQL (независимо от того, принимаете ли вы реляционное равенство или переопределенный оператор ==). Предполагая, что класс Employee имеет уникальный идентификатор try:

var query = from a in db.Activities
            where a.AssignedEmployeeId == currentUser.Id
            where a.IsComplete == false
            orderby a.DueDate
            select a;
return View(query.ToList());

Ответ 2

Не нравится тот факт, что вы пытаетесь преобразовать целостность всего объекта в запрос базы данных. Вы можете обрабатывать только сущностные запросы, используя постоянные значения, подобно тому, как вы будете выполнять SQL-запросы. Для решения этой проблемы можно было бы сравнить идентификаторы, чтобы определить, совпадает ли идентификатор AssignedEmployee с текущим идентификатором пользователя в таблице employee.

В качестве побочного примечания, если объект currentUser, который вы отслеживаете, не относится к типу Employee, вы можете подумать о кэшировании соответствующей записи Employee этого пользователя, чтобы иметь возможность ссылаться на нее в последующих запросах. Это было бы намного лучше, чем пытаться проходить через этот стол постоянно. (Опять же, это повлияет только на вас, если оно действительно находится в другой таблице)

Ответ 3

Проблема с использованием == и obj.Equals заключается в том, что Entity Framework не знает, как перевести вызов этого метода в SQL, даже если вы перегрузите эти два метода во что-то, что переводится в SQL. Что вы можете сделать, чтобы исправить этот недостаток в Entity Framework, это создать метод, который возвращает дерево выражений, которое выполняет более сложную проверку равенства, которую вы хотите сделать.

Например, допустим, что мы имеем следующий класс

public class Person {
    public string Firstname { get; set; } 
    public string Lastname  { get; set; }
}

Чтобы вернуть пользовательскую операцию равенства, которую может понять Entity Framework, добавьте следующий класс к классу Person:

public static Expression<Func<Person, bool>> EqualsExpressionTree(  Person rhs )
{
    return ( lhs ) => string.Equals( lhs.Firstname, rhs.Firstname ) &&
                      string.Equals( lhs.Lastname, rhs.Lastname );
}

В ваших запросах LINQ вы можете использовать свой собственный код равенства так:

Person anotherPerson = new Person { Firstname = "John", Lastname = "Doe" }
personCont.Where( Person.EqualsExpressionTree(anotherPerson) );
//...
if ( personCont.Any( Person.EqualsExpressionTree(anotherPerson)) ) {
//...

Кроме того, метод EqualsExpressionTree может быть переписан для вызова статического метода Equals, позволяющего использовать вашу пользовательскую логику равенства. Однако, во всем, помните, что ваш код должен перевести на выражение SQL, поскольку мы, в конце концов, вызываем базу данных и не получаем доступ к материалам из памяти.