2010-06-03 117 views
1

我下面的表结构Linq-to-sql加入/在哪里?

用户 ID

类型 ID isBool

UsersTypes 用户ID 类型

我要选择基于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. 在使用语法上的连接有没有什么区别vs哪里,哪里vs哪里cond1 & & cond2?我的理解是查询优化器将优化。
  3. 使用哪里cond1 == var1 & & cond2 == var2有和没有括号有什么区别吗?这似乎有点奇怪,有可能没有括号来构建它
  4. 在这种情况下我需要什么类型的查询?我可以看到,我可以做一个子查询或使用一个组,但不是100%确定是否需要。一个例子可能会有所帮助。我想在这种情况下可能需要子查询。

回答

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; 

有差异连接和where子句,取决于如何使用它们。无论哪种方式,使用连接是首选,因为LINQ到SQL将生成一个内部连接,而不是一个 散列 交叉连接(然后基于where子句进行筛选)。

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

+0

谢谢。但是如果没有显式连接,可以做到这一点吗?你能否提供使用selectmany的例子呢? – 2010-06-03 19:13:41

+0

“LINQ-to-SQL将生成内部连接而不是哈希连接”咦?假。 Linq to sql不会生成散列连接...它会生成sql。查询优化器根据统计信息生成散列连接,而无需输入。 – 2010-06-03 19:22:30

+0

@大卫B - 对不起......坏的术语。交叉连接如何?相当于从usertype中选择u作为u,键入t' – 2010-06-03 19:43:05

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; 
+0

谢谢。我看到忘记了加入标准。 – 2010-06-03 19:24:15

+0

Np。这是首选“加入”的主要原因:创作时不可能忘记加入标准,并且在阅读时很容易识别加入标准与过滤标准。 – 2010-06-03 19:26:09