Мой синтаксис IQueryable правильный? - PullRequest
0 голосов
/ 26 июня 2009

Сгенерированный SQL выполняет перекрестное соединение, но, когда идентификаторы совпадают, он действует как внутреннее соединение, но есть ли более эффективный способ сделать это, фактически используя ключевое слово join в C #? Есть ли способ, при котором вам не нужно указывать, как соединяются свойства, потому что все они все равно связаны иерархически

Элемент класса страницы

PageRoles - это свойство IQueryable в классе страницы

aspnet_Roles - это свойство IQueryable в классе PageRole

var item = _repository.GetByKey(999);

var f = (from fd in item.PageRoles 
         from k in fd.aspnet_Roles 
         where Roles.GetRolesForUser().Contains(k.RoleName) 
         && k.RoleId == fd.RoleId 
         select k.RoleName)
        .Count();

EDIT:

Вот пример свойства IQueryable в моих классах. Приведенный ниже пример взят из класса PageRole

public IQueryable<aspnet_Role> aspnet_Roles
{
    get
    {

          var repo=NorthCadburyWebsite.Models.aspnet_Role.GetRepo();
          return from items in repo.GetAll()
               where items.RoleId == _RoleId
               select items;
    }
}

Ответы [ 3 ]

0 голосов
/ 26 июня 2009

Это компилируется или вы получаете ошибку?

В этом случае, как вы упомянули, вам не нужно объединение. Я не использовал этот синтаксис, но похоже, что вы используете k в качестве ссылки (как псевдоним в синтаксисе sql)

Это должно дать тот же результат (даже без использования k):

var f = (from fd in item.PageRoles 
         where Roles.GetRolesForUser().Contains(fd.aspnet_Roles.RoleName) 
         && fd.aspnet_Roles.RoleId == fd.RoleId 
         select fd.aspnet_Roles.RoleName)
        .Count();

Примечание: не проверено, только предположение.

0 голосов
/ 26 июня 2009

Я думаю, что запутался, потому что вижу в вашем запросе следующую иерархию, которая не имеет никакого смысла:

[PageRoles]
|--RoleId <~~~~~~~~~.
|--[aspnet_Roles]   |
   |--RoleId ~~~~~~~*
   |--RoleName

Определяется ли иерархия RoleId, и вы имеете в виду только PageRoles.RoleId для ссылки aspnet_Roles.RoleId? Так что у вас может быть что-то вроде:

[PageRoles]  [aspnet_Roles]
|--RoleId    |--RoleId
             |--RoleName

И вы пытаетесь превратить это в следующее:

[PageRoles]
|--RoleId 
|--[aspnet_Roles] (where RoleId == PageRoles.RoleId)
   |--RoleName

...


В этом случае, если вы не можете сделать следующее, тогда что-то не так с вашими определениями свойств IQueryable , а не с отправленным вами запросом. А именно, метод получения дочерних строк PageRoles aspnet_Roles настроен неправильно.

var f = (from fd in item.PageRoles 
         from k in fd.aspnet_Roles 
         where Roles.GetRolesForUser().Contains(k.RoleName) 
         select k.RoleName)
        .Count();

(fd.aspnet_Roles уже должен быть ограничен RoleId и генерировать внутреннее соединение).

Вы можете проверить свою иерархию, посмотрев, из чего генерируется SQL:

var f = from fd in item.PageRoles
        from k in fd.aspnet_Roles
        select k;

, который должен иметь смутное сходство (с чем-то, что связано с добавленным предметом):

SELECT k.RoleName, k.SomethingElse
FROM PageRoles fd
INNER JOIN aspnetRoles k ON fd.RoleId = k.RoleId;

Я уверен, что что-то упустил, поэтому, пожалуйста, помогите мне заполнить пробелы ...

0 голосов
/ 26 июня 2009

У меня нет Intellisense со мной, но я думаю, что вы можете:

var f = (from fd in item.PageRoles 
         join k in fd.aspnet_Roles on k.RoleId equals fd.RoleId
         where Roles.GetRolesForUser().Contains(k.RoleName) 
         select k.RoleName)
        .Count();
...