2013-09-27 80 views
1

我試圖調試一個開發人員編寫和LINQ表達式使任務痛苦的代碼。我不知道如何圍繞複雜的LINQ表達式進行調試,所以任何人都可以告訴我沒有它們的等效代碼是什麼?將此linq表達式與循環(s)

instanceIdList.AddRange(
    strname.Instances 
    .Where(z => instancehealthList.Find(y => y.InstanceId == z.InstanceId 
              && y.State == "InService") != null) 
    .Select(x => x.InstanceId) 
    .ToList() 
    .Select(instanceid => new ServerObj(servertype, instanceid)) 
); 

這是寫得好嗎?一般來說,這種LINQ是被鼓勵還是皺起眉頭?

+0

我會把它分解成幾行以便於閱讀和調試,但是它沒有什麼「錯誤」。 – rboarman

+0

無論'從集合中選擇x ......選擇x'還是'collecton.Select()' - 都是LINQ,所以我不確定「等價代碼」是什麼意思。我們正在談論直SQL嗎? –

+0

我想我不太清楚每次迭代後如何進行調試。 – rcj

回答

5

使用循環會是這個樣子重構查詢:

var serverObjList = new List<ServerObj>(); 
foreach (var inst in strname.Instances) 
{ 
    foreach (var health in instancehealthList) 
    { 
     if (inst.InstanceID == health.InstanceID && health.State == "InService") 
     { 
      serverObjList.Add(new ServerObj(servertype, health.InstanceID)); 
      break; 
     } 
    } 
} 
2

它,而不是改寫了一系列foreach循環,可以在每次操作後,急切地執行該表達式,可以讓你檢查數據在中間步驟,像這樣設置:

List<var> soFar = strname.Instances.Where(z => instancehealthList.Find(y => y.InstanceId == z.InstanceId && y.State == "InService") != null).ToList(); 

List<Int64> soFar2 = soFar.Select(x => x.InstanceId).ToList(); 

List<ServerObj> soFar3 = soFar2.Select(instanceId => new ServerObj(servertype, instanceid)).ToList(); 

instanceIdList.AddRange(soFar3); 

當然,我覺得這個Linq沒有寫得很好。