我有这个问题:
var rights = from gu in db.GroupUsers
join g in db.Groups on gu.GroupId equals g.GroupId
join gr in db.GroupRights on g.GroupId equals gr.GroupId
join r in db.Rights on gr.RightId equals r.RightId
where gu.UserId == userId && g.IsDeleted == false
select r;
它被翻译成:
SELECT [t0].[Name] AS Name1, [t0].[RightId] AS RightId1
FROM [dbo].[GroupUsers] AS t1
INNER JOIN [dbo].[Groups] AS t2
ON ([t1].[GroupId] = [t2].[GroupId])
INNER JOIN [dbo].[GroupRights] AS t3
ON ([t2].[GroupId] = [t3].[GroupId])
INNER JOIN [dbo].[Rights] AS t0
ON ([t3].[RightId] = [t0].[RightId])
WHERE (([t1].[UserId] = 3345) AND ([t2].[IsDeleted] = 0))
这仍然可以,但在.NET中,我的SubSonic对象都是空的。因此查询返回15个对象,但Name和RightId是一个空字符串和-1。
这与Name1作为Name1返回并且RightId作为RightId1返回这一事实有什么关系吗?
我将查看SubSonic3的源代码以找到一些东西。
SubSonic3源代码:查询确实被转换为上面的sql。由于Name1和RightId1,Database.cs中的Load无法正常工作。这一行:
currentProp = cachedProps.SingleOrDefault
(x => x.Name.Equals(pName, StringComparison.InvariantCultureIgnoreCase));
找不到currentProp,因为currentProp是Name(和RightId)而不是Name1和RightId1。好吧,解决这个问题不适合今天。也许SubSonic3的某个人可以看看这个,因为它很烦人。我可以在源代码中编写一些hack,但它不会很漂亮。我想应该清理翻译,以便将Name1和RightId1翻译回Name和RightId。
在TSqlFormatter.cs中,下一行添加了这些AS字符串 (方法:
protected override Expression VisitSelect(SelectExpression select)
{
...
if (!string.IsNullOrEmpty(column.Name) && (c == null || c.Name != column.Name))
{
sb.Append(" AS ");
sb.Append(column.Name);
}
...
}
如果我将两个Append放在评论中,那么我的linq查询确实有效,我确实得到了正确的数据。但我猜这两条线是有原因的,但是什么原因呢?哪个用例是必要的两行?