一些帮助使LINQ子句正常工作

时间:2015-11-07 12:40:13

标签: c# linq

我有这个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查询中创建它。

1 个答案:

答案 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()函数,您可以随时询问您要查找的内容。上面的例子产生了这些结果:

  • firstNull == null
  • firstTrue == true
  • firstFalse == false
  • anyNull == false
  • anyTrue == true
  • anyFalse == false

如果你试图只在IsFixed为真时才变为真,那么任何函数应该是要走的路。再说一遍,如果我误解了你的问题,请修改。