2013-11-27 3 views
0

Я использовал структуру сущности с моим примером. Я хотел отфильтровать дочерний объект, но он прерывает программу во время выполнения с ошибкой: «Объект или сложный тип« CodeFirstNamespace.Customer »не могут быть сконструированы в запросе LINQ to Entities». Может кто-нибудь мне помочь? Благодарю.Entity Framework - фильтр дочернего объекта

public class Customer 
    { 
     public int CustomerID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 
     //public virtual ICollection<Address> Addresses 
     public List<User> Users { get; set; } 
     public List<Address> Addresses { get; set; } 
     public List<Order> Orders { get; set; } 
     public List<CheckProduct> CheckProducts { get; set; } 
    } 

public Customer GetCustomerCheckProduct(string email, Byte checkType) 
    { 
     IQueryable<Customer> customers = context.Set<Customer>().Include("CheckProducts").Where(c => c.Email == email); 
     if (checkType != 0) 
     { 
      var cus = customers.Select(customer => new Customer { CheckProducts = customer.CheckProducts.Where(s => s.CheckType == checkType).ToList() }).SingleOrDefault(); 
      return cus; 
     } 

     return null; 
    } 
+0

Почему _are_ вы пытаетесь построить нового клиента на основе существующего? 'Select (customer => new Customer ...'? Вы, в лучшем случае, запустите с клиентом _empty_, в нем будет только Checkproducts. Если вы не можете создать клиента без каких-либо других параметров, это всегда будет терпеть неудачу. – oerkelens

+0

Можете ли вы показать мне более подробный ответ? Я новичок. :( – PhuongTT

+0

Сколько еще вы хотите? Что произойдет, если вы измените свою строку, которая начинается с 'var cus =', на строку из моего ответа? :) – oerkelens

ответ

1

Предполагая, что вы хотите, чтобы найти первый (если таковой имеется) клиент, который имеет CheckProducts данного типа, то почему бы не использовать просто это?

var cus = customers.FirstOrDefault(c => c.CheckProducts.Any(cp => cp.Checktype == checkType)); 
+0

Это сработало. вы так много. Я прочитал книгу и сделаю пример. Большое спасибо. – PhuongTT

0

Для фильтрации коллекции свойства навигации вы можете сделать следующее:

var customer = <get customer entity>; 

var filteredCheckProducts = context.Entry(customer) 
    .Collection(c => c.CheckProducts) 
    .Query() 
    .Where(cp => cp.CheckType == checkType) 
    .ToArray(); 
+0

Он бросает Ошибка в строке .Collection: «Невозможно преобразовать лямбда-выражение для ввода« string », потому что это не тип делегата». Помогите мне. – PhuongTT

+0

используйте «CheckProducts», а вместо c => c.CheckProducts – Moho

Смежные вопросы