2015-11-07 38 views
0

我有这样的LINQ到实体查询:一些帮助,使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值为假t必须得到true否则t得到false

任何我需要在上面的LINQ中更改以使上面的描述逻辑工作? 我需要在一个LINQ查询中完成它。

+2

你的代码甚至编译?我的意思是'SingleOrDefault'在这里不给'bool?'。 –

+1

你的变量是bool(空),但在你的查询中选择一个对象!你需要这个对象还是一个布尔值(布尔值,我猜)? –

+0

查看以下网页上的左外连接:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

回答

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()函数真的doesn't帮助您捕捉如果布尔值为null。因此,您可以使用Any()函数,您可以随时询问您要查找的内容。上面的例子中得到这些结果:

  • firstNull == NULL
  • firstTrue == TRUE
  • firstFalse ==假
  • anyNull ==假
  • anyTrue == TRUE
  • anyFalse = = false

如果您只在IsFixed为true时才会变为true,则任何函数应该是要走的路。再次,如果我误解你的问题,那么请修改。

+0

如何检查IsNormal属性?如果它为false或true?我需要在查询中执行它! – Michael

+0

您可以随时将where条件添加到linq查询 - > where so.SiteRegionId == 6 && so.SiteId == 5 && ir.IsNormal < - 或者我误解了? – gardarvalur

+0

我编辑了一下我的答案,你是这个意思吗? – gardarvalur