4

嘿,所以我遇到了这样一种情况,我正在从数据库中拉回一个客户,并通过包含的方式将所有案例研究包括在内

return (from c in db.Clients.Include("CaseStudies")
        where c.Id == clientId
        select c).First();

但我现在要做的是在包含的案例研究中添加一个 where 子句,以便它只返回已删除 = false 的案例研究

有点像这样

return (from c in db.Clients.Include("CaseStudies")
        where c.Id == clientId
        && c.CaseStudy.Deleted == false
        select c).First();

但这不起作用:(任何想法

4

3 回答 3

7

EF v1.0 不支持开箱即用的条件包含。但是亚历克斯詹姆斯有一个有点hacky的解决方法在这里解释得很好:http: //blogs.msdn.com/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include。 aspx

 var dbquery =
   from c in db.Clients
   where c.Id == clientID
   select new {
      client = c, 
      caseStudies = from cs in c.CaseStudy
                where cs.Deleted==false
                select cs
   };

return dbquery
   .AsEnumerable()
   .Select(c => c.client);

此外,我还没有成功地使这种解决方法适用于多对多关系。

于 2009-11-05T14:34:12.983 回答
1

您可以通过这种方式返回一组相似的记录,GroupBy 将使枚举不同,但并不困难。

CaseStudies.Include("Client")
           .Where(c => !c.Deleted && c.Client.ID == ClientID)
           .GroupBy(c => c.Client.ID);
于 2009-11-05T14:46:20.143 回答
0

一种选择是对结果执行查询,如下所示:

var results = (from c in db.Clients.Include("CaseStudies")
               where c.Id == clientId
               select c).First();

results.CaseStudies = (from c in results.CaseStudies
                       where c.Deleted == false
                       select c).ToList();

或者当然你可以使用 lambda 表达式:

var results = db.Clients
                .Include(c => c.CaseStudies)
                .Where(c => c.ID == clientId).First();

results.CaseStudies = results.CaseStudies.Where(c => !c.Deleted).ToList();
于 2016-01-08T18:38:22.960 回答