Свойство Notmapped не поддерживается в LINQ to Entities - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть класс ProUser, который имеет ProUserContacts - это свойство без отображения, я использую это свойство для представления количества контактов, созданных конкретным proUser:

        public class ProUser : BaseEntity
        {
            public Guid? UserId { get; set; }
            ...
            [NotMapped]
            public int ProUserContacts { get; set; }
        }

Иконтроллер для запроса и сортировки списка proUser по ProUserContacts :

    public IEnumerable<WebDataLayer.Models.ProUser> ListAllPaging(string sortBy)
            {
                var proUsers = _proUserService.Filter(p => !p.IsDelete);
                proUsers = proUsers.OrderBy(x => x.JoinedDay);

                foreach (var item in proUsers)
                {
                    item.ProUserContacts = CountProUserContact(item.Id);
                }

                switch (sortBy?.ToLower())
                {
                   case "prousercontact":
                        proUsers = proUsers.OrderBy(x => x.ProUserContacts);
                        break;

                  default:
                        proUsers = proUsers.OrderBy(x => x.Id);
                        break;
                }
             return proUsers;
            }

Я хочу показать список proUser, отсортированный по ProUserContacts, но возникает ошибка: Указанный тип членаProUserContacts не поддерживается в LINQ to Entities.Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей. в этой строке:

proUsers = proUsers.OrderBy(x => x.ProUserContacts);

Я пробовал пару решений, рекомендованных по тем же темам, но тогда они не работали.Нужны ваши предложения !!!ОБНОВЛЕНИЕ: код для _proUserService: это просто набор соединений с БД с использованием Entity Framework

internal class ProUserService : EntityService<ProUser>, IProUserService
    {        
        public ProUserService(IUnitOfWork unitOfWork, IGenericRepository<ProUser> repository) : base(unitOfWork, repository)
        {     
        }

        public List<ProUser> GetProUsersByCustomerCode(string customerCode)
        {
            var proUsers = Repository.Filter(x => !x.IsDelete && x.CustomerCode.ToLower().Equals(customerCode.ToLower())).ToList();
            return proUsers;
        }
    }

1 Ответ

0 голосов
/ 17 декабря 2018

Кажется, проблема связана с атрибутом [NotMapped], установленным для этого свойства:

[NotMapped]
public int ProUserContacts { get; set; }

В качестве консенсуса нельзя использовать любые свойства, которые не отображаются в качестве имени столбца в базе данных внутри запроса LINQ to Entities напрямую.потому что EF не знает, как преобразовать ProUserContacts в правильный ORDER BY оператор SQL.Вам необходимо либо материализовать запрос сначала с AsEnumerable() / ToList() до OrderBy():

var prusers = proUsers.ToList().OrderBy(x => x.ProUserContacts);

, либо с помощью инкапсуляции путем создания метода расширения IQueryable, который будет использоваться вместо прямой OrderBy:

public class ProUserVM
{
    public int ProUserContacts { get; set; }
}

public static IQueryable<ProUserVM> OrderByContacts(this IQueryable<ProUser> prousers)
{
    return proUsers.Select(x => new ProUserVM
    {
        // other properties
        ProUserContacts = CountProUserContact(item.Id)
    }).OrderBy(x => x.ProUserContacts);
}

// usage
proUsers = proUsers.OrderByContacts();

или удалите атрибут [NotMapped] и создайте имя столбца на основе имени свойства.

Ссылка:

Вычисляемые свойства и Entity Framework

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...