有助于使LINQ子句正常工作
本文关键字:工作 常工作 LINQ 子句 有助于 | 更新日期: 2023-09-27 18:20:54
我有这个Linq到实体的查询:
bool? t = (from ir in Context.InspectionReview
join so in Context.SiteObjects on ir.ObjectId equals so.Id
where so.SiteRegionId == 6 && so.SiteId == 5
select bool?
ir.IsNormal
).FirstOrDefault();
ir.IsNormal
-是布尔值
当不满足此条件where so.SiteRegionId == 6 && so.SiteId == 5
时t
得到null
,当我至少有一个记录ir.IsNormal == false
值为false时,t
必须得到true
,否则t
得到false
。
我必须在上面的LINQ中更改什么才能使上面的描述逻辑工作?我需要在一个LINQ查询中创建它。
改为使用Any()函数怎么样?
var t = (from ir in Context.InspectionReview
join so in Context.SiteObjects on ir.ObjectId equals so.Id
where so.SiteRegionId == 6 && so.SiteId == 5
select new
{
inspReviewID = ir.Id,
isFixed = ir.IsNormal,
objId = so.Id
}).Any();
看完你的评论后,我想我可能误解了你的问题。然而,如果你试图找出结果是否为任何真正的"IsNormal",你总是可以这样做:
var t = (from ir in Context.InspectionReview
join so in Context.SiteObjects on ir.ObjectId equals so.Id
where so.SiteRegionId == 6 && so.SiteId == 5
select new
{
inspReviewID = ir.Id,
isFixed = ir.IsNormal,
objId = so.Id
}).Any(a => a.isFixed);
第三版
在你编辑了你的问题之后,我用小测试片段修改了我的答案,以证明我的观点。
public class Derp
{
public int SiteRegionId { get; set; }
public int SiteId { get; set; }
public bool? IsNormal { get; set; }
}
然后我使用Derp类来匹配您的示例:
List<Derp> nullDerps = new List<Derp>();
nullDerps.Add(new Derp
{
IsNormal = null,
SiteId = 5,
SiteRegionId = 6
});
List<Derp> trueDerps = new List<Derp>();
trueDerps.Add(new Derp
{
IsNormal = true,
SiteId = 5,
SiteRegionId = 6
});
List<Derp> falseDerps = new List<Derp>();
falseDerps.Add(new Derp
{
IsNormal = false,
SiteId = 5,
SiteRegionId = 6
});
bool? firstNull = (from d in nullDerps
where d.SiteRegionId == 6 && d.SiteId == 5
select d.IsNormal).FirstOrDefault();
bool? firstTrue = (from d in trueDerps
where d.SiteRegionId == 6 && d.SiteId == 5
select d.IsNormal).FirstOrDefault();
bool? firstFalse = (from d in falseDerps
where d.SiteRegionId == 6 && d.SiteId == 5
select d.IsNormal).FirstOrDefault();
bool anyNull = (from d in nullDerps
where d.SiteRegionId == 6 && d.SiteId == 5
select d.IsNormal).Any(a => a.HasValue && a.Value);
bool anyTrue = (from d in trueDerps
where d.SiteRegionId == 6 && d.SiteId == 5
select d.IsNormal).Any(a => a.HasValue && a.Value);
bool anyFalse = (from d in falseDerps
where d.SiteRegionId == 6 && d.SiteId == 5
select d.IsNormal).Any(a => a.HasValue && a.Value);
使用FirstOrDefault()函数的方法实际上并不能帮助您捕捉布尔值是否为null。因此,您可以使用Any()函数,在该函数中,您可以始终明确询问要查找的内容。上面的例子产生了以下结果:
- firstNull==null
- firstTrue==true
- firstFalse==false
- anyNull==false
- anyTrue==true
- anyFalse==false
如果你只想在IsFixed为true的情况下获得true,那么Any函数应该是可行的。同样,如果我误解了你的问题,请修改。