Этот код у вас здесь:
XmlSerializer s = new XmlSerializer(typeof(EmailRuleList));
TextReader r = new StreamReader(path);
_emailRuleList = (EmailRuleList)s.Deserialize(r);
TargetPST[] PSTList = _emailRuleList.Items;
foreach (TargetPST targetPST in PSTList)
{
olRoot = GetRootFolder(targetPST.name);
if (olRoot != null)
{
Parse[] ParseList = targetPST.Items;
foreach (Parse parseRules in ParseList)
{
EmailRule[] EmailRuleList = parseRules.Items;
foreach (EmailRule targetFolders in EmailRuleList)
{
}
}
}
}
В LINQ это просто следующее:
var query = from targetPST in _emailRuleList.Items
let olRoot = GetRootFolder(targetPST.name)
where olRoot != null
from parseList in targetPST.Items
from emailRule in parseList.Items
select [whatever you want to select];
Отсюда, просто включите соответствующие предложения where. На каждом «уровне» у вас есть доступ к объектам, ранее указанным в предложении from, поэтому, если вы хотите выполнить один из ваших запросов (ваш первый), это будет примерно так:
where emailRule.address == ToAddress &&
parseList.toAddress == true &&
parseList.useJustDomain == false
select new {
EmailRule = emailRule,
Parse = parseList,
TargetPST = targetPST
}
Чтобы сделать это в методах, я думаю, что вы приносите больше вреда, чем пользы (особенно в удобочитаемости), но здесь это так. Важно отметить, почему это так сложно, потому что вложенный набор предложений FROM преобразуется в SelectMany, и, в конечном счете, вам необходим EmailRule со связанными родительскими объектами, вы должны сделать весь выбор внутри набора вложенных лямбд. чтобы иметь ссылки на родительские объекты (поскольку сами дочерние объекты не имеют обратных ссылок).
_emailRuleList
.Where( targetPst => GetRootFolder( targetPst.Name ) != null )
.SelectMany( targetPst => {
return targetPst.Items.SelectMany( parse => {
return parse.Items.Select( rule => {
return new {
TargetPST = targetPst,
Parse = parse,
EmailRule = rule
};
} );
} );
} )
.Where( x => x.EmailRule.address == ToAddress &&
x.Parse.toAddress == true &&
x.Parse.useJustDomain == false );