C# 为什么不同的T-SQL生成的表结构几乎相同
这真的让我发疯,我不明白为什么希望有人能给我一点提示,为什么会这样。我有四张桌子 这两个表中的第一组,能够给我一个干净漂亮的T-SQL(样本来自) 但第二组C# 为什么不同的T-SQL生成的表结构几乎相同,c#,sql,sql-server,linq,entity-framework,C#,Sql,Sql Server,Linq,Entity Framework,这真的让我发疯,我不明白为什么希望有人能给我一点提示,为什么会这样。我有四张桌子 这两个表中的第一组,能够给我一个干净漂亮的T-SQL(样本来自) 但第二组 public partial class Cust_ProfileTbl { public Cust_ProfileTbl() { balance = new List<BP_BalanceTbl>(); } [Key] public virtual long bintAc
public partial class Cust_ProfileTbl
{
public Cust_ProfileTbl()
{
balance = new List<BP_BalanceTbl>();
}
[Key]
public virtual long bintAccountNo { get; set; }
public string varCardNo { get; set; }
public virtual ICollection<BP_BalanceTbl> balance { get; set; }
}
public class BP_BalanceTbl
{
public BP_BalanceTbl() { }
public virtual long bintAccountNo { get; set; }
[Key]
public int intid { get; set; }
public virtual Cust_ProfileTbl profile { get; set; }
}
问题
在第一种情况下,您正在为简单导航属性执行Include (因此,它可以通过简单的左外联接完成,响应中的每一行都将在结果中具体化为实体), 在第二种情况下,包含集合,因此结果中的几行应该合并到单个实体及其集合属性中。因此,SQL查询必须以以下方式编写: 1.将按顺序提取要合并到单个实体中的所有行 2.促进检测组边界的处理 3.减少数据重复 在这种简单的情况下,可以消除生成的SQL的某些部分,但当包含多个集合属性时,它们将用于更复杂的查询e.t.c
List<Student> student = context.student.ToList();
var r = from ord in context.student.Include("standard")
select ord;
SELECT
[Extent1].[StudentId] AS [StudentId],
[Extent1].[StudentName] AS [StudentName],
[Extent2].[StandardId] AS [StandardId],
[Extent2].[StandardName] AS [StandardName],
[Extent2].[Description] AS [Description]
FROM [dbo].[Students] AS [Extent1]
LEFT OUTER JOIN [dbo].[Standards] AS [Extent2] ON [Extent1].[Standard_StandardId] = [Extent2].[StandardId]
public partial class Cust_ProfileTbl
{
public Cust_ProfileTbl()
{
balance = new List<BP_BalanceTbl>();
}
[Key]
public virtual long bintAccountNo { get; set; }
public string varCardNo { get; set; }
public virtual ICollection<BP_BalanceTbl> balance { get; set; }
}
public class BP_BalanceTbl
{
public BP_BalanceTbl() { }
public virtual long bintAccountNo { get; set; }
[Key]
public int intid { get; set; }
public virtual Cust_ProfileTbl profile { get; set; }
}
List<Cust_ProfileTbl> profile = context.profile.ToList();
var rs = from ord in context.profile.Include("balance")
select ord;
SELECT
[Project1].[C1] AS [C1],
[Project1].[bintAccountNo] AS [bintAccountNo],
[Project1].[varCardNo] AS [varCardNo],
[Project1].[C2] AS [C2],
[Project1].[intid] AS [intid],
[Project1].[bintAccountNo1] AS [bintAccountNo1]
FROM ( SELECT
[Extent1].[bintAccountNo] AS [bintAccountNo],
[Extent1].[varCardNo] AS [varCardNo],
1 AS [C1], --Why it generate this>?
[Extent2].[intid] AS [intid],
[Extent2].[bintAccountNo] AS [bintAccountNo1],
CASE WHEN ([Extent2].[intid] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2] --Why it generate this>?
FROM [dbo].[Cust_ProfileTbl] AS [Extent1]
LEFT OUTER JOIN [dbo].[BP_BalanceTbl] AS [Extent2] ON [Extent1].[bintAccountNo] = [Extent2].[bintAccountNo]
) AS [Project1]
ORDER BY [Project1].[bintAccountNo] ASC, [Project1].[C2] ASC