如何在Entity框架中进行左连接?

时间:2010-11-23 12:29:43

标签: entity-framework join

我是Entity Framework的新手,我对包含连接的查询有些麻烦。 这是我正在使用的模型:
http://img690.imageshack.us/img690/7132/modelow.png

我想查询所有模型,使用给定配置文件的启用信息(我从实例信息中获取)。 作为第一步,我试图在所有模型存在时使用启用的信息(左连接),但是失败了。我尝试了Join方法,但我甚至无法编译。

var modelList = dc.db.models.Join(dc.db.profile_model,
                y => y.id,
                s => s.models.id,
                (y, s) => new Object( y.id, y.display, s.enabled, s.models, s.profiles )
                ))

关于这个函数的MSDN与intellisense给我的不一致,我对参数有麻烦。我认为前3个是好的(第二个表和要加入的2个键),但我无法正确获得最后一个。我怎么能得到一个包含模型和profile_model的所有字段的对象?

由于

<小时/> 更新
更清楚的是,这是用简单的旧SQL编写的查询:

select m.*, p.enabled from models m
left join profile_model p on m.id = p.model_id
where p.profile_id = 
(
  select profile_id from instances where instances.display = 'PTXM11602' 
)
or profile_id is null

如何使用e-f编写?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要每个模型的模型列表,该模型的所有实例。当您正确设计模型并在数据库中具有所有正确的引用键时,您应该能够编写如下内容:

var models =
    from model in db.models
    where (
        from pm in model.profile_models
        from instance in pm.profile.instances
        where instance.display == "PTXM11602").Any()
      ||
        !model.profile_models.Any()
    select model;

var results =
    from pm in db.profile_models
    where pm.profile.instances.Any(i => i.display == "PTXM11602")
    where models.Contains(pm.model)
    select new 
    {
        Model = pm.model,
        Enabled = pm.enabled
    };

请阅读this MSDN forum以获取使用Entity Framework 3.5的Contains方法。