我有这个Linq to Entity查询:
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
值为t
时必须true
,否则t
获得false
{{1}}
我在上面的LINQ中需要更改什么才能使上面的描述逻辑工作? 我需要在一个LINQ查询中创建它。
答案 0 :(得分:2)
如何使用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()函数,您可以随时询问您要查找的内容。上面的例子产生了这些结果:
如果你试图只在IsFixed为真时才变为真,那么任何函数应该是要走的路。再说一遍,如果我误解了你的问题,请修改。