Linq-to-sql присоединиться / где? - PullRequest
1 голос
/ 03 июня 2010

У меня есть следующие структуры таблиц

Пользователи ID

Типы Я бы isBool

UsersTypes Идентификатор пользователя Типы

Я хочу выбрать все типы пользователей на основе id и isBool.

Я пробовал этот запрос

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%, требуется ли это. Пример может быть полезным. Я думаю, что в этом случае может потребоваться подзапрос.

Ответы [ 2 ]

4 голосов
/ 03 июня 2010

Ваш запрос не объединяет эти две таблицы ни в одном общем поле:

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 голос
/ 03 июня 2010
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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...