85

查询内容:

从服务中选择s.*sa.ServiceId=s.Id上的内部联接ServiceAssignment sa其中sa.LocationId=1

在实体框架中?

这是我写的:

var serv=(来自db.Services中的s在s.id上的Location中加入sl等于sl.id其中sl.id=s.id选择s)。ToList();

但这是错误的。有人能引导我走这条路吗?

3个答案

重置为默认值
110
来自数据库中的s。服务在数据库中加入sa。s.Id上的ServiceAssignments等于sa.ServiceId其中sa.LocationId==1选择s

在哪里?数据库是你的吗数据库上下文。生成的查询如下所示(EF6示例):

选择[Extent1]。[Id]AS[Id]--Services表中的其他字段来自[dbo]。[服务]AS[范围1]内部加入[dbo]。[服务分配]AS[范围2]打开[范围1]。[Id]=[Extent2]。[服务ID]WHERE[范围2]。[LocationId]=1
5
  • 这不是一个左外部连接吗? 评论 2013年8月29日22:55
  • @乔纳森伍德不,那是内部连接。左外部联接将由组联接生成。 评论 2014年3月10日14:56
  • 我们可以在数据库中使用来自s的吗。服务在数据库中加入sa。s.Id上的ServiceAssignments等于sa.ServiceId||s.Id等于null其中sa.LocationId==1选择s
    – 罗汉德
    评论 2015年9月23日12:54
  • 非常感谢。。。我用过List<Item>items=(..您的代码..).toList();
    – 用户4227915
    评论 2015年11月24日12:38
  • 6
    @如果你有一个导航属性(从下面的例子中),你可以使用Method语法。但如果不是,它看起来会像这样(相当多毛):数据库。服务。加入(db.ServiceAssignments,s=>s.Id,sa=>sa.ServiceId,(s,sa)=>new{service=s,alert=sa})。其中(ssa=>ssa.alert.LocationId==1)。选择(ssa=>ssa.service); 评论 2016年4月21日15:29
75

如果有人对Method语法感兴趣,如果您有导航属性,那么很容易做到:

数据库。服务。其中(s=>s.ServiceAssignment.LocationId==1);

如果你没有,除非有连接()override我不知道,我认为它看起来很粗糙(我是一个Method语法纯粹主义者):

数据库。服务。加入(db.ServiceAssignments,s=>s.Id,sa=>sa.ServiceId,(s,sa)=>new{service=s,asgnmt=sa}).其中(ssa=>ssa.asgnmt.LocationId==1).选择(ssa=>ssa.service);
  • 如果FK-to-ServiceAssignment碰巧可以为null,这将不起作用,是吗?
    – 卡丁
    评论 2016年7月20日3:30
  • @如果是卡丹的话,我建议你用C#6?。操作员。如果没有,只需在使用导航属性之前检查null。通常,您不会在示例中添加一堆防御代码,以免混淆主要要点。如果FK可以为null,则它将如下所示:(C#6)数据库。服务。其中(s=>s?.ServiceAssignment.LocationId==1);或者类似于C#5:数据库。服务。其中(s=>s.ServiceAssignment!=null&&s.ServiceAssiignment.LocationId==1); 评论 2016年7月25日18:10
  • 1
    @迈克尔·布莱克本这是真的!这更容易理解。感谢您的澄清。:)
    – 卡丁
    评论 2016年7月26日1:15
8

如果导航属性可用,您可以使用它。它在SQL中生成一个内部联接。

来自数据库中的s。服务其中s.ServiceAssignment。位置Id==1选择s
0

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.