Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不同的T-SQL生成的表结构几乎相同_C#_Sql_Sql Server_Linq_Entity Framework - Fatal编程技术网

C# 为什么不同的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

这真的让我发疯,我不明白为什么希望有人能给我一点提示,为什么会这样。我有四张桌子

这两个表中的第一组,能够给我一个干净漂亮的T-SQL(样本来自)

但第二组

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; }

}
问题

  • 为什么在第二个LINQ中是生成C1
  • 为什么在第二个LINQ中,当([Extent2].[intid]为NULL)然后强制转换(NULL为int),否则1结束为[C2]--为什么它会生成此>
  • 为什么第二个输出如此复杂
  • C1列似乎与查询无关—它可能是自动进行的优化或保护,以便LINQ不会意外地创建无效的内容—或者可能是为了第一行不会无意中具有空值

  • 生成C2列是为了防止出现空值,因为该值被赋予主键属性(这意味着它不能为空)。由于正在进行左外部联接,因此左侧的值可能没有联接记录,但必须仍然显示左侧信息的有效行

  • 查询看起来更复杂,因为它在选择结果之前在临时表中构造这些额外信息。它可能以这种方式布置查询,只是因为这是它知道如何通过代码生成它的唯一方式——或者它足够聪明,知道这个查询对于查询引擎来说稍微更为优化(我可能不会打赌)


  • 在第一种情况下,您正在为简单导航属性执行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