我的IQueryable语法是否正确?

时间:2009-06-26 16:06:24

标签: asp.net-mvc linq subsonic subsonic3

生成的SQL会进行交叉连接,但是当ID匹配时,它就像一个内连接,但是通过在C#中实际使用join关键字,有更好的方法吗?有没有一种方法你不必指定属性如何加入,因为它们无论如何都是相关的

项目是Page class

PageRoles是Page类

中的IQueryable属性

aspnet_Roles是PageRole类中的IQueryable属性

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();

修改

以下是我的类中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 :(得分:0)

我没有智能感知,但我认为你可以:

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();

答案 1 :(得分:0)

这会编译还是会出错?

在这种情况下,正如您所提到的,您不需要加入。 我没有使用这种语法,但看起来你使用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();

注意:未经测试,只是猜测。

答案 2 :(得分:-1)

我觉得我很困惑,因为我在您的查询中看到以下层次结构没有任何意义:

[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的{​​{1}}子行的方法。

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约束并生成内部联接。

您可以通过查看生成的SQL来检查层次结构:

RoleId

应该模糊地类似(与投掷项目有关的事情):

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

我确定我错过了什么,所以请帮助我填补空白......