有助于使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 == 5t得到null,当我至少有一个记录ir.IsNormal == false值为false时,t必须得到true,否则t得到false

我必须在上面的LINQ中更改什么才能使上面的描述逻辑工作?我需要在一个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函数应该是可行的。同样,如果我误解了你的问题,请修改。