SubSonic3 linq 问题

发布于 2024-08-17 16:48:22 字数 1812 浏览 8 评论 0原文

我有这样的查询:

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。

这与 Name 作为 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);
    }
    ...
}

如果我将两个 Appends 放在注释中,那么我的 linq 查询确实有效,并且我确实获得了正确的数据。但我猜这两行的存在是有原因的,但是什么原因?这两行在哪个用例中必要的?

I have this query:

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;

It gets translated to:

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

This is still ok, but in .NET my SubSonic objects are all empty. So the query returns 15 objects, but Name and RightId are an empty string and -1.

Can this have anything to do with the fact that Name is returned as Name1 and RightId is returned as RightId1?

I'll have a look into the source code of SubSonic3 to find something.

SubSonic3 Source Code: the query does get translated to the sql above. Because of the Name1 and RightId1, the Load in Database.cs doesn't work properly. The line :

currentProp = cachedProps.SingleOrDefault
    (x => x.Name.Equals(pName, StringComparison.InvariantCultureIgnoreCase));

doesn't find the currentProp because the currentProp is Name (and RightId) and not Name1 and RightId1. Well, fixing this won't be for today. Maybe someone from SubSonic3 can have a look at this, because it's pretty annoying. I could write a sort of hack into the source code, but it won't be pretty. I guess the translation should be cleaned up so that Name1 and RightId1 are translated back to Name and RightId.

In TSqlFormatter.cs there's next line that adds these AS strings
(in method :

protected override Expression VisitSelect(SelectExpression select)
{
    ...
    if (!string.IsNullOrEmpty(column.Name) && (c == null || c.Name != column.Name))
    {
        sb.Append(" AS ");
        sb.Append(column.Name);
    }
    ...
}

If I put the two Appends in comment, then my linq query does work and I do get the right data. But I guess those two lines are there for a reason, but what reason? In which usecase are the two lines necessary?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文