【问题标题】:why LINQ 2 SQL sometime add a field like select 1 as test, others valid fields为什么 LINQ 2 SQL 有时会添加一个像 select 1 这样的字段作为测试,其他有效字段
【发布时间】:2011-02-10 18:09:00
【问题描述】:

我必须连接 2 个 linq2sql 查询,我有一个问题,因为 2 个查询不返回相同数量的列,奇怪的是在查询上的 .ToList() 之后,它们可以毫无问题地连接。

原因是,由于某些 linq2sql 原因,我还有 2 个名为 test 和 test2 的列来自 linq2sql 自动创建的 2 个左外连接,例如“选择 1 作为测试, 表字段”

有什么好的理由吗?如何删除这个额外的“1 作为测试”字段?

这里有几个例子:google result for linq 2 sql "select 1 as test"

【问题讨论】:

  • 我已经看到了,这很奇怪,据我所知,您对此无能为力。我从未见过它会导致问题 - 如果它破坏了你的应用程序,你应该发布失败的实际代码。
  • 遗憾的是,我无法发布导致它的实际代码
  • 也许您应该在一个样本中重现您的症状,您可以从中发布 sn-ps?

标签: linq-to-sql


【解决方案1】:

好的,假设我们有 2 个表:dbo.Userdbo.Client。每个client 可以连接(或不连接)到user。所以client 记录有一个可以为空的外键字段来标识user

对于查询:

var query = context.Clients
      .Select(c => c.User);

LINQ 会产生类似于:

SELECT [t2].[test], [t2].[Id], [t2].[Username], ...
FROM [dbo].[Client] AS [t0]
LEFT OUTER JOIN (
    SELECT 1 AS [test], [t1].[Id], [t1].[Username], ...
    FROM [dbo].[User] AS [t1]
    ) AS [t2] ON [t2].[Id] = [t0].[UserId]

由于并非所有client 记录都有匹配的user 记录,LINQ 正在创建一个查询,以确保每个无用户client 都有一个填充空的行。这是通过创建一个名为[test] 的额外虚拟列来完成的。

因此,将[test] 列值设置为1 的行真正连接到user 实体。

我想这个[test] 列被 LINQ 用作一个标志,意思是“嘿,这是一个用户定义的客户端”。

如果我决定重写此查询,我将使用user 主键作为指示符,但对于 LINQ,使用[test] 列似乎更容易。

【讨论】:

  • 谢谢!这是我的同事和我试图弄清楚的一个谜!
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2011-05-15
  • 2019-07-26
  • 2021-06-25
  • 2019-03-02
  • 2022-09-23
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多