我使用以下linq查询来处理XML文件。。
XElement rootElement = XElement.Load(@"test.xml");
int StyCode;
var lv1s = from lv1 in rootElement.Descendants("Class")
where lv1.Attribute("Code").Value.Equals("002")
select new
{
Children = from ltd in lv1.Descendants("Subject")
where ltd.Attribute("Course").Value.Equals("Math")
select new
{
****//In This below section need result on condition based... ****
if(StyCode=0)
{
Children1 = ltd.Attribute("AllTeachers").Value.Equals("Y") ? true : false
}
else
{
Children2 = ltd.Attribute("SpeciaGuest").Value.Equals("Y") ? true : ltd.Elements("Topic").Attributes("Code").Where(x => x.Value.Equals("1")).FirstOrDefault() != null ? true : false
}
}
};
下面是我的XML结构。。
<?xml version="1.0" encoding="utf-8" ?>
<Document>
<Class Code="001">
<Subject Course="Math" AllTeachers='N' SpeciaGuest='N'></Subject>
<Subject Course="Engish" AllTeachers='Y' SpeciaGuest='Y'></Subject>
<Subject Course="History" AllTeachers='Y' SpeciaGuest='Y'></Subject>
</Class>
<Class Code="002">
<Subject Course="Math" AllTeachers='Y' SpeciaGuest='N'>
<Topic Code="1">LAW1</Topic>
<Topic Code="2">
LAW2
</Topic>
<Topic Code="3">
LAW3</Topic>
</Subject>
<Subject Course="Engish" AllTeachers='Y' SpeciaGuest='Y'></Subject>
<Subject Course="History" AllTeachers='Y' SpeciaGuest='Y'></Subject>
</Class>
</Document>
请告诉我,如何使用条件来选择多选结果。还让我知道在这个linq查询中使用重新锐化会很好吗?。
因为if(StyCode=0)
不是基于序列中的当前项,所以可以将if
拉到查询之外:
还要注意,因为两个Select
子句都选择了一个项目,所以不需要匿名类型,只需选择该项目即可。结果是:
XElement rootElement = XElement.Load(@"test.xml");
int StyCode = 0;
IEnumerable<IEnumerable<bool>> lv1s;
if (StyCode == 0)
{
lv1s = from lv1 in rootElement.Descendants("Class")
where lv1.Attribute("Code").Value.Equals("002")
select (from ltd in lv1.Descendants("Subject")
where ltd.Attribute("Course").Value.Equals("Math")
select ltd.Attribute("AllTeachers").Value.Equals("Y") ? true : false);
}
else
{
lv1s = from lv1 in rootElement.Descendants("Class")
where lv1.Attribute("Code").Value.Equals("002")
select (from ltd in lv1.Descendants("Subject")
where ltd.Attribute("Course").Value.Equals("Math")
select ltd.Attribute("SpeciaGuest").Value.Equals("Y") ? true : ltd.Elements("Topic").Attributes("Code").Where(x => x.Value.Equals("1")).FirstOrDefault() != null ? true : false);
}
所以这很简单,很好,但有很多代码重复,这也不是很好。另一条路是创建一个方法,该方法使用表示ltd
的XElement
和整数StyCode
,并返回一个指示适当值的布尔值。这是一个足够简单的编写方法:
private static bool GetChildFromSubject(int styCode, XElement subject)
{
if (styCode == 0)
return subject.Attribute("AllTeachers").Value.Equals("Y");
else
{
return subject.Attribute("SpeciaGuest").Value.Equals("Y") ||
subject.Elements("Topic").Attributes("Code")
.Any(x => x.Value.Equals("1"));
}
}
现在我们只需要一个查询:
XElement rootElement = XElement.Load(@"test.xml");
int StyCode = 0;
var lv1s = from lv1 in rootElement.Descendants("Class")
where lv1.Attribute("Code").Value.Equals("002")
select (from ltd in lv1.Descendants("Subject")
where ltd.Attribute("Course").Value.Equals("Math")
select GetChildFromSubject(StyCode, ltd));
好多了。
bool flag = boolexpression ? true : false;
与相同
bool flag = boolexpression;
因此,停止使用三进制使代码不必要地复杂化。
您可以将select子句写成:
select new
{
Children1 = (StyCode==0) ? ltd.Attribute("AllTeachers").Value.Equals("Y") : false,
Children2 = (StyCode==0) ? false :
ltd.Attribute("SpeciaGuest").Value.Equals("Y")
|| ltd.Elements("Topic").Attributes("Code").Where(x => x.Value.Equals("1")).FirstOrDefault() != null
}
有些人可能会说,重复这种情况是不好的形式。如果你在那个阵营,我建议你使用这个:
select (StyCode == 0) ? objectContructor1(ltd) : objectConstructor2(ltd)
您需要使用条件运算符:
Children1 = StyCode == 0 ?
ltd.Attribute("AllTeachers").Value == "Y"
:
(ltd.Attribute("SpeciaGuest").Value == "Y"
|| ltd.Elements("Topic").Attributes("Code").Select(a => a.Value).Contains("1")
)
您不能创建具有不同属性的匿名对象。那么序列类型是什么?您可以为同一属性分配不同的值(通过三元运算符?:
(
XDocument xdoc = XDocument.Load(@"test.xml");
var lv1s = from c in xdoc.Descendants("Class")
where (string)c.Attribute("Code") == "002"
select new {
Children = (StyCode == 0) ?
((string)c.Attribute("AllTeachers") == "Y") :
((string)c.Attribute("SpeciaGuest") == "Y") ||
c.Elements("Topic") .
.Any(t => (string)t.Attribute("Code") == "1"))
};
顺便说一句,您返回的是具有布尔Children
属性的对象列表。我相信你需要更多的数据。