2011-10-07 47 views
3

這裏是我的類:LINQ的內部的LINQ造成序列返回任何結果

public class XDetail 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
} 

public class X 
{ 
    public int XID { get; set; } 
    public int ID { get; set; } 
} 

的ID在它們之間共享,以X和XDetail鏈接(一對多關係)。我在使用下面的LINQ查詢文件中讀取並塑造一個匿名類型:

var results = from line in File.ReadAllLines(file) 
       select new 
       { 
        XID = int.Parse(line.Substring(0, 8).TrimStart('0')), 
        Name = line.Substring(8, 255).Trim() 
       }; 

這個數據是用來檢查對現有X/XDetail做出適當的修改或添加新記錄。 XList是一個列表,XDetailList是一個列表。

從那裏我試圖看中LINQ查詢來匹配合適的項目:

var changedData = from x in XList 
        join xDetail in XDetailList on x.ID equals xDetail.ID 
        where 
        (!results.Any(p => p.XID.Equals(x.XID)) 
        || !results.Any(p => p.Name.Equals(xDetail.Name))) 
        select new 
        { 
         XValue = x, 
         XDetailValue = xDetail, 
         Result = (from result in results 
           where result.Name.Equals(xDetail.Name) 
           select result).Single() // This line is my bane 
        }; 

所以我可以得到我在尋找塑造成新的匿名類型,但是當我試圖在增加的結果該結果= ...內部linq查詢我的整個集轉向:序列不包含任何元素。如果我刪除它,我會得到我想要的結果集。 X/XDetail實際上是類型化的DataRows,我需要在使用匹配結果進一步處理時使用它,但沒有那個結果,我需要做一個後來的linq查詢來找到匹配。我希望能以一種冷靜的方式來做到這一點。

我試過改變結果沒有where子句,我可以得到一個結果,但我希望匹配的結果。有沒有更好的方法來寫這個或者讓結果集再次運行的方法?

+0

這裏的結果是什麼?它的類型是什麼? –

+0

結果是來自第一個查詢的匿名類型,我正在解析該文件的XID和名稱。 – ShelbyZ

+0

我不明白你在說'從XDetail中的xDetail'和'XDetail'是不是一個類填充任何數據?你怎麼做?(我只是問。) – Bastardo

回答

1

試着改變你的。單以.SingleOrDefault。有可能你正在查找給定的x.Detail.Name不在你的結果集中的行。

(從評論到回答,以便它可以被正確標記)

4

一個問題是,結果是IEnumerable - 所以你每次從而導致File.ReadAllLines(file)執行時間重新查詢它 - 實際上,你在呼喚File.ReadAllLines(file)N時間,這聽起來並不健康。

相反,你希望把這種枚舉到內存一次 - 強制執行渴望與ToList()

var results = (from line in File.ReadAllLines(file) 
       select new 
       { 
        XID = int.Parse(line.Substring(0, 8).TrimStart('0')), 
        Name = line.Substring(8, 255).Trim() 
       }).ToList(); 
+0

當文件沒有行時,這仍然可能會崩潰 – Frederiek