C# LINQ查询-未遵守join和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

我有一个链接查询,它简单地连接到两个表,还有一个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 && !c.Archived 
 select c
一个简单的linqpad屏幕截图显示
隔间项目
返回时附加到
隔间
,但不管它们是否存档

感觉我在这里太过密集了,有人能帮我找出问题所在吗

非常感谢您的任何想法

编辑: 因此,我回去更详细地研究了这一点,并确定了为什么我只归还了隔间。这是因为存储库通常只返回域类型供使用。 因此,在不引入单个随机DTO类型对象的情况下,我无法返回多个实体类型(其他repo都不会返回域类型以外的任何类型)

因此,考虑到这一点,我有4种选择:

  • 为此目的创建一个随机DTO
  • 查询数据库两次,并作为第二次查询获取隔间项
  • 从存储库返回IQueryable(同样,这在其他任何地方都不会执行)
  • 返回分区,而不考虑归档的分区项,并在内存中的消费方法中将它们过滤掉

  • 关于这里的最佳方法有什么想法吗?

    看看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中仔细考虑时,仅从主表中选择值的概念将需要第二个查询来获取子元素,这当然不会使用相同的条件#掌纹