2012-01-30 57 views
0

我想做类似的事情;过滤FirstOrDefault()之前的结果然后使用FirstOrDefault()

Context.Users.Include("Addresses", a => a.IsRowDeleted == false).FirstOrDefault(u => u.UserId == 5); 

我是说;我想过滤包含的实体,但并不总是,它也必须是可选的。

这是最好的解决方案是什么?请帮我,

+0

请问您能更清楚地询问您想问什么?如果你可以举例说明会很好。包含定义在哪里? – Maheep 2012-01-30 04:15:55

回答

3

在EF您不能过滤急于加载的数据。 Include操作不支持筛选或排序。

您必须使用投影定制型(或匿名类型):

var query = from u in context.Users 
      where u.UserId == 5 
      select new UserFiltered 
       { 
        User = u, 
        Addresses = u.Addresses.Where(a => !a.IsRowDeleted) 
       }; 
UserFiltered u = query.FirstOrDefault(); 

,或者您必须devide查询分成两个分开的查询和使用明确的加载:

context.ContextOptions.LazyLoadingEnabled = false; 
var user = context.Users.FirstOrDefault(u => u.UserId == 5); 
((EntityCollection<Address>)user.Addresses) 
    .CreateSourceQuery() 
    .Where(a => !a.IsRowDeleted) 
    .Execute();    

或者你可以只需使用两个查询:

var user = context.Users.FirstOrDefault(u => u.UserId == 5); 
var addresses = context.Addresses.Where(a => a.User.UserId == 5 && !a.IsRowDeleted).ToList(); 
2

你的意思是这样(警告:未经测试的代码):

Context.Users.SingleOrDefault(u => u.Addresses.Where(a => a.IsRowDeleted == false).Count > 0) && u.UserId == 5); 
相关问题