【问题标题】:Linq query for Where on the Joined table without needing joinLinq 查询联接表上的 Where 而不需要联接
【发布时间】:2017-05-11 16:44:46
【问题描述】:

尝试获取以下 SQL 的 linq 查询(或 lambda 语法),该 SQL 选择连接表中具有等于“blob”的属性的所有“数据”。

除了:没有明确使用 Join,但是

select data.*
from data
    join settings on data.DataID = settings.DataID
where settings.Attribute = 'blob'

显式定义连接

from d in dbcontext.Data
  join s in dbcontext.Settings on d.DataID equals s.DataID
where s.Attribute == "blob"
select d

但是有没有办法使用上下文 dbcontext.Data.Settings 像下面这样?

from d in dbcontext.Data
where d.Settings.Attribute == "blob"
select d

Settings 是一个集合类型,因此会想到 .Contains 和 .Where 之类的内容。

使用 .Contains,我的理解是我需要传入一个对象类型

where d.Settings.Contains(new Settings(d.DataID, "blob", null))

但我不关心空(值)匹配,只关心列设置

一些表结构

Data
   DataID
   Name

Settings
    DataID
    Attribute
    Value

【问题讨论】:

    标签: c# entity-framework linq join


    【解决方案1】:

    据我了解,您拥有 Settings 集合导航属性,因此您可以简单地使用它(“导航”)而不是显式加入:

    from d in dbcontext.Data
    from s in d.Settings
    where s.Attribute == "blob"
    select d
    

    或者你可以使用Any扩展方法,在这种情况下比Contains更合适(虽然Contains也可以使用,但需要与Select结合使用):

    dbcontext.Data.Where(d => d.Settings.Any(s => s.Attribute == "blob"))
    

    为了完整起见,这里是Contains 版本:

    dbcontext.Data.Where(d => d.Settings.Select(s => s.Attribute).Contains("blob"))
    

    【讨论】:

    • 太棒了。注意2点。在 d.Settings 中使用 s 的跟踪创建了我提到的 SQL。但是出于好奇,LinqPad 创建了一个 From Data, Settings WHERE data.Id = Settings.ID sql,我已经很久没有看到 join 这样做了。
    【解决方案2】:

    如果我正确理解了您的问题,您希望创建一个 LINQ,该 LINQ 将抓取具有“Blah”属性且存储在另一个表中的任何 DataID。

    如果是这样,这可能会起作用。

    var dataIDs = Setting.Where(entry => entry.Attribute == "Blah")
                 .Select(entry => entry.DataID); // gets all DataIDs that match the attribute
    
    var data = Data.Where(entry => entry.DataID in dataIDs); // gets data info based on DataIDs. 
    

    它应该可以工作,但你应该做的是有点像左连接

    select a.*
    from data a
        left join settings b
    on a.DataID = b.DataID
    where b.Attribute = 'blob'
    

    但在 LINQ 中。此查询将允许您获取与属性“blob”匹配的 DataID 的所有数据。我没有在 LINQ 中做过,所以如果更熟悉 linq 左连接的人可以做出回应,可能会更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多