Linq-to-sql join / where?

时间:2010-06-03 18:50:37

标签: c# linq linq-to-sql

我有以下表结构

用户 ID

类型 ID isBool

UsersTypes 用户身份 类型

我想根据id和isBool选择所有UserTypes。

我试过了这个查询

var q = from usertype in usertypes
        from type in types
        where type.isBool == false
        where userstypes.user == id
        select usertype;

但这并没有像预期的那样奏效。我的问题是:

  1. 为什么?
  2. 使用连接语法与where,where vs cond1&& COND2?我的理解是查询优化器将进行优化。
  3. 使用cond1 == var1&& cond2 == var2有和没有括号?这似乎很奇怪,可以在没有括号的情况下构建它
  4. 在这种情况下我需要什么类型的查询?我可以看到我可以做一个子查询或使用一个组,但不是100%确定是否需要。一个例子可能会有所帮助。我认为在这种情况下可能需要子查询。

2 个答案:

答案 0 :(得分:4)

您的查询不会在任何公共字段上加入这两个表:

var q = from u in usertypes
        join t in types on u.typeid equals t.id
        where t.isBool == false && usertypes.user == id
        select u;

join和where子句之间存在差异,具体取决于它们的使用方式。无论哪种方式,首选使用连接是因为LINQ-to-SQL将生成内连接而不是 hash 交叉连接(然后根据where子句进行过滤)。

您不需要括号。您可以包含它们,因为它们在某些情况下确实有助于提高可读性。

答案 1 :(得分:1)

var q = from usertype in usertypes 
        from type in types
        where type.isBool == false 
        where usertype.user == id 
        where usertype.typeid = type.id //join criteria
        select usertype;