我有多个记录的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
中的一条记录。谢谢
答案 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的任何记录,但是无论是否匹配,它都会得到一条记录。