生成的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;
}
}
答案 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;
我确定我错过了什么,所以请帮助我填补空白......