2009-11-05 112 views
4

嘿,所以我得在那裏我從數據庫中通過的方式拉客戶回來,包括所有的案例研究,它的情況包括的LINQ包括與where子句

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

但我想現在要做的就是和所包含的casestudies where子句所以它只返回,其中刪除了案例研究=假

有點像這個

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

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

+0

能不能細說「沒有按沒有工作「?以什麼方式?你看到了什麼? – 2009-11-05 14:23:12

+0

你是什麼意思的「不工作」?它是否會拋出異常,是否不會返回您期望的結果?被刪除了一個布爾值? – 2009-11-05 14:24:05

回答

7

條件包括在EF v1.0中不支持開箱即用。但弗格森詹姆斯有那麼好這裏解釋有點哈克解決方法: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); 

而且,我還沒有成功,使這個解決辦法的工作與許多一對多的關係。

+0

更好的答案是'CaseStudies'上的查詢,包括'Client',然後'Select'Client,slap'.Distinct().ToList()',瞧! 'Client.CaseStudies'將通過導航屬性自動填充。 – JoeBrockhaus 2014-11-13 21:11:27

+0

此編碼是否正確? '客戶'是無處被發現是誠實的.. – Mittchel 2015-12-29 20:17:56

+0

我認爲它也值得一提的是,AsNoTracking將阻止EF做關係修復魔術(例如'從db.Clients.AsNoTracking()'中的c) – Vladimirs 2016-02-29 14:57:27

1

您可以通過這種方式返回一組類似的記錄,GroupBy將使枚舉不同,但並不困難。

CaseStudies.Include("Client") 
      .Where(c => !c.Deleted && c.Client.ID == ClientID) 
      .GroupBy(c => c.Client.ID); 
+0

這個會是我的建議。 'GroupBy'可以工作,但你也可以''選擇'客戶'。所以,你會得到一個'IEnumerable '。此外,還要將'.Distinct()'拍到最後(EF知道是什麼使得客戶端不同,因此您不需要特殊的'IEqualityComparer ')。由於導航屬性,每個「Client.CaseStudies」都將被填充。 – JoeBrockhaus 2014-11-13 21:08:19

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();