I am having LINQ query in which I have to response with a result set which is depending on inner field collection. I have done the thing via LINQ query then a foreach but I wanted to avoid foreach loop and do it somehow from group by
List<ResultModel> result = new List<ResultModel>();
var tempResultSet = _context.MainRecordTable.Where(h => h.id)
.Select(lev => new
{
Contacts = (lev.basetable2 != null
&& lev.basetable2.basetable3 != null
&& lev.basetable2.basetable3.basetable6 != null
&& lev.basetable2.basetable3.basetable6.Any(h=>h.contact != null)
? lev.basetable2.basetable3.basetable6.Where(h=>h.contact != null).Select(h=>h.contact).Distinct() : null),
Key1 = lev.basetable5 != null ? lev.basetable5.Id : null,
Key2 = lev.basetable2 != null && lev.basetable2.basetable3 != null && lev.basetable2.basetable3.basetable4 != null ?
lev.basetable2.basetable3.basetable4.id : null
})
.Distinct()
.ToList();
foreach (var x in tempResultSet)
{
if (x.Contacts != null)
{
foreach (var contact in x.Contacts)
{
result.Add(new ResultModel
{
Key1 = x.Key1,
Key2 = x.Key2,
ContactKey = contact.id
});
}
}
else
{
result.Add(new ResultModel
{
Key1 = x.Key1,
Key2 = x.Key2
});
}
}
return result;
My Final Linq query is like
return _context.baseTable1.Where(h => h.id == Id ).Select(lev => new { Contact = (lev.baseTable2 != null && lev.baseTable2.baseTable3 != null && lev.baseTable2.baseTable3.baseTable5.Any(h => h.contact != null) ? lev.baseTable2.baseTable3.baseTable5.Where(h => h.contact != null).GroupBy(h => h.contact).Select(c=>c.FirstOrDefault().contact) : null), Key1 = lev.office != null ? lev.office.id, : null, Key2 = lev.baseTable2 != null && lev.baseTable2.baseTable3 != null && lev.baseTable2.baseTable3.baseTable4 != null ? lev.baseTable2.baseTable3.baseTable4.id : null
}).ToList().SelectMany(x =>
{
if (!x.Contact.Any())
{
return new List<FinalModel> { new FinalModel { Key1 = x.Key1, Key2 = x.Key2 } };
}
else
return x.Contact.Select(contact => new FinalModel()
{
ContactKey = contact.id,
Key1 = x.Key1,
Key2 = x.Key2
});
});