如果没有匹配的记录,则记录任何一条记录-Linq

时间:2018-11-23 06:58:10

标签: c# .net linq linq-to-entities

我有多个记录的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计数为0,则我需要resultStaffGua中的一条记录。谢谢

2 个答案:

答案 0 :(得分:2)

假设您打算检索一条记录(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(); }

答案 1 :(得分:1)

  

如果结果计数为0,则需要来自parentList的一条记录。

有时候,显而易见的解决方案是最好的。为什么不在代码后添加它呢?

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

如果您想成为“聪明人”,并且全部完成一行操作(我想这可能会节省数据库事务),则可以将Where换成OrderBy和{ {1}}。

所以代替:

Take

您可以这样做:

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

这将优先考虑将).OrderBy( i => i.IsPrimary ? 0 : 1 ).Take(1); 设置为true的任何记录,但是无论是否匹配,它都会得到一条记录。