0

生成的 SQL 进行交叉连接,但由于 ID 匹配,它的行为类似于内部连接,但是否有更好的执行方式通过实际使用 C# 中的 join 关键字来执行此操作?有没有一种方法可以让您不必指定属性的连接方式,因为无论如何它们都是层次相关的

项目是一个页面类

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;
    }
}
4

3 回答 3

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

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

于 2009-06-26T16:21:24.330 回答
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();
于 2009-06-26T16:16:27.683 回答
-1

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

[页面角色]
|--角色标识 <~~~~~~~~~。
|--[aspnet_Roles] |
   |--RoleId ~~~~~~~*
   |--角色名

层次结构是否由RoleIdand 你只是PageRoles.RoleId为了参考aspnet_Roles.RoleId?所以你可能有类似的东西:

[PageRoles] [aspnet_Roles]
|--角色ID |--角色ID
             |--角色名

而且您正试图将其变为以下内容:

[页面角色]
|--角色标识
|--[aspnet_Roles](其中 RoleId == PageRoles.RoleId)
   |--角色名

...?


在这种情况下,如果您不能执行以下操作,那么您的 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;

我确定我遗漏了一些东西,所以请帮我填空......

于 2009-06-26T17:03:23.913 回答