Это будет легче, если вы настроите запрос для использования фактического синтаксиса языка LINQ (а не методов расширения), так как тогда вы можете использовать let
:
var filterList = (
from x in lstStudents
from y in x.Credentials
let s = utilities.DecryptStringFromBase64String(y.Cred, key)
let d = new Data
{
StudentName = x.Name,
CredentialKey = y.Key,
UserName = s.Before(":::"),
Password = s.After(":::")
}
where d.CredentialKey == "N1"
select d
).ToList();
или сделать * На 1005 * раньше, чтобы избежать некоторых вычислений / распределений:
var filterList = (
from x in lstStudents
from y in x.Credentials
where y.Key == "N1"
let s = utilities.DecryptStringFromBase64String(y.Cred, key)
let d = new Data
{
StudentName = x.Name,
CredentialKey = y.Key,
UserName = s.Before(":::"),
Password = s.After(":::")
}
select d
).ToList();
Лично я бы также изменил все x
, y
, s
, d
на более значимые, но я пока оставил их такими же, чтобы вы могли видеть, как они отображаются.
Альтернативой было бы, как отметил @Sinatr в комментариях, использовать лямбду с телом:
var filterList = lstStudents.SelectMany(x => x.Credentials.Select(y => {
var s = utilities.DecryptStringFromBase64String(y.Cred, key);
return new Data {
StudentName = x.Name,
CredentialKey = y.Key,
UserName = s.Before(":::") ,
Password = s.After(":::")
};
}))
.Where(d => d.CredentialKey == "N1")
.ToList();