Linq查询Joined表上的Where而不需要加入

时间:2017-05-11 16:44:47

标签: c# entity-framework linq join

尝试为以下SQL获取linq查询(或lambda语法),选择连接表中具有等于“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

设置是一个集合类型,因此会出现像.Contains和.Where这样的内容。

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

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

但我不关心null(Value)匹配,只关注列设置

一些表结构

Data
   DataID
   Name

Settings
    DataID
    Attribute
    Value

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你想创建一个LINQ,它将获取任何属性为“Blah”的DataID,该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就可以做出更好的反应