我有一个简单的文本文件,其中包含一些CSV,具有以下结构:
我的目的是使用LINQ查询此文件,而无需将其全部内容加载到内存中。首先,我创建了一个实现IEnumerable接口的类(在此处为MyCustomReader),其中我使用StreamReader获取文件的每一行。
例如,以下代码获取所有Parent对象(不包括子对象):
然而,当我想要创建涉及父对象和子对象的查询时,我遇到了麻烦。例如,获取特定父对象的所有子对象,或获取包含相同值的特定子字段的所有父对象。
例如,以下代码可以获取特定父对象的所有子对象:
第二个例子:
这两个例子如何使用LINQ实现?
'@' 表示一个父对象,其直接下方是子对象。(使用XML可以更好地表示这一点,但在我的情况下这不是一个选项。)@Parent1_Field1, Parent1_Field2, Parent1_Field3 Child1_Field1, Child1_Field2 Child2_Field1, Child2_Field2 ...etc. @Parent2_Field1, Parent2_Field2, Parent2_Field3 Child1_Field1, Child1_Field2 Child2_Field1, Child2_Field2 ...etc.
我的目的是使用LINQ查询此文件,而无需将其全部内容加载到内存中。首先,我创建了一个实现IEnumerable接口的类(在此处为MyCustomReader),其中我使用StreamReader获取文件的每一行。
例如,以下代码获取所有Parent对象(不包括子对象):
from line in MyCustomReader
where line.StartsWith("@")
select Parent.Create(line)
然而,当我想要创建涉及父对象和子对象的查询时,我遇到了麻烦。例如,获取特定父对象的所有子对象,或获取包含相同值的特定子字段的所有父对象。
例如,以下代码可以获取特定父对象的所有子对象:
public IEnumerable<Child> GetChildrenForAParent(string uniqueParentName)
{
Parent parent = null;
foreach (string line in MyCustomReader)
{
if (line.StartsWith("@"))
parent = Parent.Create(line);
else if (parent.UniqueName == uniqueParentName)
yield return Child.Create(line);
}
}
第二个例子:
public IEnumerable<Parent> GetParentsWhereChildHasThisValue(string childFiledValue)
{
Parent parent = null;
foreach (string line in MyCustomReader)
{
if (line.StartsWith("@"))
{
parent = Line.Create(line);
}
else //child
{
Child child = Child.Create(line);
if (child.FiledValue == childFiledValue)
yield return parent;
}
}
}
这两个例子如何使用LINQ实现?