Возьмите любую отдельную запись, если соответствующие записи не доступны - Linq - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть запрос linq, в котором есть несколько записей, и я фильтрую эти записи, используя предложение where.

Теперь, если отфильтрованные записи ничего не возвращают, мне нужно установить по умолчанию значение для любой отдельной записи из списка.

var resultStaffGua = (from s in _db.Students
 join sg in _db.StudentStaffGuardians on s.StudentID equals sg.StudentId
 join g in _db.Staffs on sg.StaffId equals g.StaffID
 join lr in _db.luRelationTypes on sg.RelationTypeId equals lr.RelationTypeID
 join ga in _db.StaffAddresses on g.StaffID equals ga.StaffID
 join ad in _db.Addresses on ga.AddressID equals ad.AddressID
 where
 lse.StatusID == (int?)Extension.StatusType.Active 
 && lse.TenantID == tenantid
 select new
 {
     g.FirstName,
     g.LastName,
     IsPrimary = sg.IsPrimaryGuardian,
     se.Email,
     Phone = sphon.PhoneNumber,
     lr.RelationCD,
     gdnr.GenderCD,
     ad.Zipcode
 }).Where(i=>i.IsPrimary==true);

, если resultStaffGua count0, мне нужна одна запись из resultStaffGua.Спасибо

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Предполагая, что вы намереваетесь получить одну запись (не более одной записи с IsPrimary==true):

var query = (from s in...); //The whole query except the "where"
var resultStaffGua = query.SingleOrDefault(i=>i.IsPrimary==true) ?? query.First();

В противном случае, если запрос может фактически вернуть более одного результата:

var query = (from s in...);
var resultStaffGua = query.Where(i=>i.IsPrimary==true);
if(resultStaffGua.Count() == 0) resultStaffGua = new[] { query.First(); }
0 голосов
/ 23 ноября 2018

если результат равен 0, мне нужна одна запись из parentList.

Иногда очевидное решение является лучшим.Почему бы не добавить это после кода?

if (resultStaffGua.Count() == 0) 
{
    resultStaffGua = parentList.First();  
}

Если вы хотите быть "умным" и делать все это в одной строке (и я полагаю, это слишком вероятно сохранит транзакцию БД), вы можете обменять свой Where для OrderBy и Take.

Таким образом, вместо:

).Where(i=>i.IsPrimary==true);

Вы можете сделать:

).OrderBy( i => i.IsPrimary ? 0 : 1 ).Take(1);

Это будет определять приоритет любой записиIsPrimary имеет значение true, но он получит одну запись независимо от того, совпадает ли она.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...