У меня есть такая сущность POCO
public class Product : Entity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
public virtual ICollection<Order> Orders { get; set; }
[NotMapped]
public int UsersCount
{
get
{
return Orders.Count();
}
}
}
Метод доступа к продукту
public IQueryable<Product> GetAll()
{
return _context.Product.Include(I=>I.Orders);
}
Когда я загружаю все продукты в View
var model = _productService.GetAll().Select(p => new AdminProductViewModel
{
Active = p.Active,
Id = p.Id,
Name = p.Name,
UsersCount = p.UsersCount
}).ToList();
я получаю исключение
Член указанного типа «UsersCount» не поддерживается в LINQ to Entities.
Я действительно не могу понять, почему Linq to Entity дает исключение. Может кто объяснит что не так?
Мы также используем вычисляемые поля в другом приложении, подобном этому
public class User : Entity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Email { get; set; }
[MaxLength(50)]
public string FirstName { get; set; }
[MaxLength(50)]
public string LastName { get; set; }
public virtual ICollection<Order> Orders { get; set; }
public virtual ICollection<Statistic> Statistics { get; set; }
[NotMapped]
public bool Active
{
get
{
return Orders.Any(c => c.Active && (c.TransactionType == TransactionType.Order || c.TransactionType == TransactionType.Subscription));
}
}
[NotMapped]
public int CreditsLeft
{
get
{
return Orders.Where(w => w.Active).Sum(p => p.Credits != null ? p.Credits.Value : 0);
}
}
}
public User Get(int id)
{
return _context.User.FirstOrDefault(u => u.Id == id);
}
var user = _userService.Get(_authUser.Id);
var model = new UserViewModel
{
Active = user.Active,
FullName = user.FullName,
Email = user.Email,
};
и нет проблем, EF6 не дает никаких исключений, хотя у него также есть два вычисляемых поля User.Active
и User.CreditsLeft
UsersCount
и пытается перевести это в SQL. Он не просматривает членов, с которыми сталкивается в запросах LINQ. Кроме того,UsersCount
не отображается, поэтому, если EF может сопоставить его со столбцом или функцией SQL, вы не разрешили это сделать. Вам придется написатьOrders.Count()
непосредственно в операторе LINQ. - person Gert Arnold   schedule 16.09.2014