C# LINQ查询-未遵守join和where子句?
我有一个链接查询,它简单地连接到两个表,还有一个where子句,出于某种奇怪的原因,查询似乎不遵守where子句 我的问题如下:C# LINQ查询-未遵守join和where子句?,c#,linq,where-clause,C#,Linq,Where Clause,我有一个链接查询,它简单地连接到两个表,还有一个where子句,出于某种奇怪的原因,查询似乎不遵守where子句 我的问题如下: from p in Platforms join c in Compartments on p.Id equals c.PlatformId join ci in CompartmentItems on c.Id equals ci.CompartmentId where p.Id == 4042 && !ci.Archived &am
from p in Platforms
join c in Compartments on p.Id equals c.PlatformId
join ci in CompartmentItems on c.Id equals ci.CompartmentId
where p.Id == 4042 && !ci.Archived && !c.Archived
select c
一个简单的linqpad屏幕截图显示隔间项目
返回时附加到隔间
,但不管它们是否存档
感觉我在这里太过密集了,有人能帮我找出问题所在吗
非常感谢您的任何想法
编辑:
因此,我回去更详细地研究了这一点,并确定了为什么我只归还了隔间。这是因为存储库通常只返回域类型供使用。
因此,在不引入单个随机DTO类型对象的情况下,我无法返回多个实体类型(其他repo都不会返回域类型以外的任何类型)
因此,考虑到这一点,我有4种选择:
关于这里的最佳方法有什么想法吗?看看SQL查询本身。我相信它符合你的过滤器。我打赌你有懒惰加载,这就是为什么你看到所有的隔间项目 或者,如果您不使用SQL后端,则必须在隔间和隔间项目之间建立关系。当您使用导航属性时,它将返回所有的分隔项 这里没有虫子
尝试创建包含所有隔间项目的隔间。存档=1。您将看到您的声明不会返回此隔间。您将使用您的隔间,将其与隔间项目合并,过滤掉一些隔间项目,然后完全忽略您加入表中的所有隔间项目,只需选择这些隔间,然后使用完全不同的机制来获取每个隔间的所有隔间项目,即使用内置的relationship属性 要仅获取与给定过滤器匹配的隔间项目,您需要实际使用
select
子句选择您过滤的隔间项目,然后不要使用Include
将它们全部包括在内。这可能看起来像:
from p in Platforms
join c in Compartments on p.Id equals c.PlatformId
join ci in CompartmentItems.Where(ci => !ci.Archived)
on c.Id equals ci.CompartmentId into compItems
where p.Id == 4042 && !c.Archived
select new
{
Compartment = c,
CompartmentItems = compItems,
}
试着这样做
from p in Platforms
join c in Compartments on p.Id equals c.PlatformId
join ci in CompartmentItems on c.Id equals ci.CompartmentId
where p.Id == 4042
where !ci.Archived
where !c.Archived
select c
它使您绕过了link试图为属性查询相同记录的问题。当逻辑被&&分隔时,它看起来像是作为
p.Id == 4042 && !p.Archived && !p.Archived
这是LINQ仅使用列表中的第一项应用属性筛选器的结果,而不考虑其余项的差异。LINQ Join with into子句和where条件
var li = (from cert in db.tbl_ISOCetificate
join comCert in db.tbl_ComGroupCertificate.Where(x=>x.GroupID ==GroupID) on cert.Cert_id equals comCert.CerID into jo
from b in jo.DefaultIfEmpty()
select new { cert.Cert_id, cert.Cert_Name}).ToList();
最后一行是
选择c
。所以这正是查询所做的。谢谢你的解释,我知道这是我的愚蠢。当我在SQL中仔细考虑时,仅从主表中选择值的概念将需要第二个查询来获取子元素,这当然不会使用相同的条件#掌纹