gpt4 book ai didi

c# - LINQtoSQL 生成的 SQL 中有太多外连接

转载 作者:太空宇宙 更新时间:2023-11-03 22:27:33 24 4
gpt4 key购买 nike

我对 LINQ2SQL 查询生成的 SQL 语句有疑问。我有两个数据库表(VisibleForDepartmentId 是外键):

AssignableObject                 Department
---------------------- ------------
AssignableObjectId ┌────> DepartmentId
AssignableObjectType │
VisibleForDepartmentId ───┘

以及下面的映射信息(注意AssignableObject是抽象的):

<Database Name="SO_755661" Class="DataClassesDataContext">
<Table Name="dbo.AssignableObject" Member="AssignableObjects">
<Type Name="AssignableObject" Modifier="Abstract">
<Column Name="AssignableObjectId" Type="System.Int32"
DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true"
IsDbGenerated="true" CanBeNull="false" />
<Column Name="AssignableObjectType" Type="System.String"
DbType="VarChar(50) NOT NULL" CanBeNull="false"
AccessModifier="Private" IsDiscriminator="true"/>
<Column Name="VisibleForDepartmentId" Type="System.Int32"
DbType="Int" CanBeNull="true" />
<Association Name="Department_AssignableObject" Member="VisibleForDepartment"
ThisKey="VisibleForDepartmentId" OtherKey="DepartmentId"
Type="Department" IsForeignKey="true" />
<Type Name="Asset" InheritanceCode="Asset" IsInheritanceDefault="true" />
<Type Name="Role" InheritanceCode="Role" />
</Type>
</Table>
<Table Name="dbo.Department" Member="Departments">
<Type Name="Department">
<Column Name="DepartmentId" Type="System.Int32"
DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true"
IsDbGenerated="true" CanBeNull="false" />
<Column Name="Name" Type="System.String" DbType="VarChar(50) NOT NULL"
CanBeNull="false" />
<Association Name="Department_AssignableObject" Member="AssignableObjects"
ThisKey="DepartmentId" OtherKey="VisibleForDepartmentId"
Type="AssignableObject" />
</Type>
</Table>
</Database>

以及以下代码:

var loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Asset>(a => a.VisibleForDepartment);
dataContext.LoadOptions = loadOptions;
var assets = from a in dataContext.Assets
select a;

这将导致具有两个相同左外连接的 SQL 查询:

SELECT t0.AssignableObjectType, t0.AssignableObjectId, t0.VisibleForDepartmentId,
t2.test, t2.DepartmentId, t2.Name, t4.test AS test2,
t4.DepartmentId AS DepartmentId2, t4.Name AS Name2
FROM dbo.AssignableObject AS t0
LEFT OUTER JOIN (
SELECT 1 AS test, t1.DepartmentId, t1.Name
FROM dbo.Department AS t1
) AS t2 ON t2.DepartmentId = t0.VisibleForDepartmentId
LEFT OUTER JOIN (
SELECT 1 AS test, t3.DepartmentId, t3.Name
FROM dbo.Department AS t3
) AS t4 ON t4.DepartmentId = t0.VisibleForDepartmentId

为什么有两个外连接,一个就足够了?

亲切的问候,

罗纳德

最佳答案

我找出了导致这些重复外连接的原因。当一个持久类被两个或多个子类继承时,它们就会发生。对于每个子类,如果您使用 LoadWith,则会将一个新的外部连接添加到生成的 SQL 语句中。

在我的示例中,AssignableObject 有两个子类:AssetRole。这会导致与 Department 表的两个外部联接。如果我添加另一个子类,则会添加第三个外部连接。

我不确定 SQL Server 是否足够智能以意识到外部联接是重复的。我有 posted this在 Microsoft Connect 上。

编辑:显然我的问题与another issue 重复并且它不会在下一版本的 LINQ2SQL 中得到修复。

关于c# - LINQtoSQL 生成的 SQL 中有太多外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/755661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com