2011-10-07 64 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