为什么LINQ 2 SQL有时会添加一个像select 1这样的字段作为test,其他有效字段

Fre*_*dou 6 linq-to-sql

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

原因是,对于一些linq2sql的原因,我还有2个名为test和test2的列来自linq2sql自动创建的2个左外连接,类似"select 1 as test, tablefields"

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

这里有一些它的样子:google结果为linq 2 sql"select 1 as test"

Ale*_*lex 5

好吧,我们假设我们有2个表:dbo.Userdbo.Client.每个client都可以连接(或不连接)user.因此,client记录具有可识别的外键字段user.

对于查询:

var query = context.Clients
      .Select(c => c.User);
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

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

因此,[test]列值设置为的行实际上已1连接到user实体.

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

如果我决定重写这个查询,我将使用user主键作为指标,但对于LINQ来说,似乎更容易使用[test]列.