如果匹配记录不可用,则获取任何单个记录 - Linq

Take any single record if matching records not available - Linq

我有一个包含多个记录的 linq 查询,我正在使用 where 子句过滤这些记录。

现在,如果筛选的记录 return 什么都没有,那么我需要将其设为默认值,以采用列表中的默认 任何单个 记录。

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 计数 0,我需要来自 resultStaffGua 的一条记录。谢谢

if result count 0, I need one record from parentList.

有时显而易见的解决方案是最好的。为什么不在您的代码后添加这个?

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

如果你想成为 "clever" 并在一行中完成所有操作(我想这很可能会节省数据库事务)你可以将你的 Where 换成 OrderByTake.

所以代替:

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

你可以这样做:

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

这将优先考虑 IsPrimary 设置为 true 的任何记录,但无论是否匹配,它都会获得一条记录。

假设您的目的是检索一条记录(最多有一条记录带有 IsPrimary==true):

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

否则,如果查询实际上 return 多个结果:

var query = (from s in...);
var resultStaffGua = query.Where(i=>i.IsPrimary==true);
if(resultStaffGua.Count() == 0) resultStaffGua = new[] { query.First(); }