2017-04-11 204 views
1

我想知道如何改變這個實體框架的linq查詢。實體框架LINQ查詢

我有以下的列表A:項目(VARCHAR),代碼(VARCHAR),評估(整數)

代碼數據是分層 - 即10011,10012,10013個...等都是兒童代碼1001再如123001,123002,12300,12301是代碼兒童1230

我想根據項目的查詢,然後再通過代碼的每一行,並評估檢索所有它的孩子= 0(例如)

我寫了下面的代碼,但沒有給出正確的結果:

var result = db.tableA.AsQueryable(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue)); 
result = tempResult.Where(c => c.Code.StartsWith(c.Code) && c.assess== 0); 

上面的查詢沒有返回代碼的孩子在那裏的項目等於「ProjectValue」

+0

什麼是實際存儲在項目中?不要孩子分享同一個項目?!你也在說選擇'c => c.Code.StartsWith(c.Code)'這總是所有的數據,因爲你正在對它進行自我檢查。你需要定義你正在尋找什麼c.Code – Armin

+0

沒有孩子不共享同一個項目。最初我想查詢他們的項目='ABC'的所有項目,那麼我想要從主表中檢索所有子代碼,其中評估等於0 – ibrahim

+0

下面更新的答案應該爲你做 – Armin

回答

1

你需要知道哪些記錄是父母爲了做到這一點,如果沒有你的病情StartsWith將永遠是真實的,因爲你有孩子,在tempResult父。

我假定具有最小長度的代碼是父母。 選擇父母之後,您只需記錄以父代碼開頭但與父代碼長度不同的所有記錄。

var result = db.tableA.AsQueryable(); 
var minLength = result.Select(t => t.Code.Length).Min(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue) && p.Code.Length == minLength); 
result = result.Where(c => tempResult.Any(d => c.Code.StartsWith(d.Code)) && c.assess== 0 && c.project.Equals(ProjectValue) && c.Code.Length != minLength); 
0

我能想到的,現在最接近的事,與你在你的問題已經給了上下文的量將最終是:

var result = db.tableA.AsQueryable(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue)).select(p => p.code); 
result = result.Where(c => tempResult.contains(c.Code.substring(0, 4)) && c.assess== 0 && c.project.Equals(ProjectValue)); 
+0

tempResult.contains(c.Code。子字符串(0,4))將始終爲true,當c.project.Equals(ProjectValue)爲true時 –