1

我的 REST 服务中的 SQL 生成存在很大问题:

以下代码生成 2 个不同的 SQL 语句(PC Win8 与 Server 2008 R2):

    private void GetData()
    {
        ctPostBox = new CTPostBox(GetDBConnection(DatabaseKind.dkGlobal));

        var lQry = (from d in ctPostBox.CONTACTUSER.Include("CONTACT").Include("CONTACT.DBLINK").Include("CONTACT.CONTACTLASTUSED").Include("CONTACT.EMAILACCOUNT")
                     where ((d.CONTACT.ID_DBLINK == 0 || d.CONTACT.ID_DBLINK == null) || (d.CONTACT.DBLINK.MANDNR == UserConfig.mandNr))
                     select new
                     {
                         READDATE = d.READDATE,
                         ID = d.CONTACT.ID,
                         DBID = d.CONTACT.DBID,
                         DATEINSERT = d.CONTACT.DATEINSERT,
                         FROMUSER = d.CONTACT.FROMUSER,
                         FILENAME = d.CONTACT.FILENAME,
                         KIND = d.CONTACT.KIND,
                         MSGID = d.CONTACT.MSGID,
                         ID_DBLINK = d.CONTACT.ID_DBLINK,
                         DBID_DBLINK = d.CONTACT.DBID_DBLINK,
                         SUBJECT = d.CONTACT.SUBJECT,
                         STATE = d.CONTACT.STATE,
                         DATEINCOME = d.CONTACT.DATEINCOME,
                         DATESEND = d.CONTACT.DATESEND,
                         ID_EMAILACCOUNT = d.CONTACT.ID_EMAILACCOUNT,
                         DBID_EMAILACCOUNT = d.CONTACT.DBID_EMAILACCOUNT,    
                         GESCHST = d.CONTACT.DBLINK.GESCHST,
                         d.CONTACT.DBLINK.KEYTYP,
                         KONTO = d.CONTACT.EMAILACCOUNT.NAME
                     });

        WriteFile(@"C:\Temp\log.log",lQry.ToString());
    }

SQL开发PC(一切都很好):

    SELECT 
    "C"."ID_CONTACT" AS "ID_CONTACT", 
    "C"."READDATE" AS "READDATE", 
    "C"."DBID_CONTACT" AS "DBID_CONTACT", 
    "D"."DATEINSERT" AS "DATEINSERT", 
    "D"."FROMUSER" AS "FROMUSER", 
    "D"."FILENAME" AS "FILENAME", 
    "D"."KIND" AS "KIND", 
    "D"."MSGID" AS "MSGID", 
    "D"."ID_DBLINK" AS "ID_DBLINK", 
    "D"."DBID_DBLINK" AS "DBID_DBLINK", 
    "D"."SUBJECT" AS "SUBJECT", 
    "D"."STATE" AS "STATE", 
    "D"."DATEINCOME" AS "DATEINCOME", 
    "D"."DATESEND" AS "DATESEND", 
    "D"."ID_EMAILACCOUNT" AS "ID_EMAILACCOUNT", 
    "D"."DBID_EMAILACCOUNT" AS "DBID_EMAILACCOUNT", 
    "F"."GESCHST" AS "GESCHST", 
    "F"."KEYTYP" AS "KEYTYP", 
    "H"."NAME" AS "NAME"
    FROM    "CONTACTUSER" AS "C"
    INNER JOIN "CONTACT" AS "D" ON ("C"."ID_CONTACT" = "D"."ID") AND ("C"."DBID_CONTACT" = "D"."DBID")
    LEFT OUTER JOIN "DBLINK" AS "F" ON ("D"."ID_DBLINK" = "F"."ID") AND ("D"."DBID_DBLINK" = "F"."DBID")
    INNER JOIN "EMAILACCOUNT" AS "H" ON ("D"."ID_EMAILACCOUNT" = "H"."ID") AND ("D"."DBID_EMAILACCOUNT" = "H"."DBID")
    WHERE ((0 = "D"."ID_DBLINK") OR ("D"."ID_DBLINK" IS NULL)) OR ("F"."MANDNR" =         @p__linq__0)

SQL Server(DBLINK 上的多个 JOINS,非常慢):

    SELECT 
    "C"."ID_CONTACT" AS "ID_CONTACT", 
    "C"."READDATE" AS "READDATE", 
    "C"."DBID_CONTACT" AS "DBID_CONTACT", 
    "F"."DATEINSERT" AS "DATEINSERT", 
    "F"."FROMUSER" AS "FROMUSER", 
    "F"."FILENAME" AS "FILENAME", 
    "F"."KIND" AS "KIND", 
    "F"."MSGID" AS "MSGID", 
    "F"."ID_DBLINK" AS "ID_DBLINK", 
    "F"."DBID_DBLINK" AS "DBID_DBLINK", 
    "F"."SUBJECT" AS "SUBJECT", 
    "F"."STATE" AS "STATE", 
    "F"."DATEINCOME" AS "DATEINCOME", 
    "F"."DATESEND" AS "DATESEND", 
    "F"."ID_EMAILACCOUNT" AS "ID_EMAILACCOUNT", 
    "F"."DBID_EMAILACCOUNT" AS "DBID_EMAILACCOUNT", 
    "J"."GESCHST" AS "GESCHST", 
    "L"."KEYTYP" AS "KEYTYP", 
    "N"."NAME" AS "NAME"
    FROM       "CONTACTUSER" AS "C"
    INNER JOIN "CONTACT" AS "D" ON ("C"."DBID_CONTACT" = "D"."DBID") AND     ("C"."ID_CONTACT" = "D"."ID")
    LEFT OUTER JOIN "CONTACT" AS "F" ON ("C"."DBID_CONTACT" = "F"."DBID") AND ("C"."ID_CONTACT" = "F"."ID")
    LEFT OUTER JOIN "DBLINK" AS "H" ON ("F"."DBID_DBLINK" = "H"."DBID") AND ("F"."ID_DBLINK" = "H"."ID")
    LEFT OUTER JOIN "DBLINK" AS "J" ON ("F"."DBID_DBLINK" = "J"."DBID") AND ("F"."ID_DBLINK" = "J"."ID")
    LEFT OUTER JOIN "DBLINK" AS "L" ON ("F"."DBID_DBLINK" = "L"."DBID") AND ("F"."ID_DBLINK" = "L"."ID")
    LEFT OUTER JOIN "EMAILACCOUNT" AS "N" ON ("F"."DBID_EMAILACCOUNT" = "N"."DBID")         AND ("F"."ID_EMAILACCOUNT" = "N"."ID")
    WHERE ((0 = "D"."ID_DBLINK") OR ("F"."ID_DBLINK" IS NULL)) OR ("H"."MANDNR" = @p__linq__0)

这里是代码优先数据:受保护的覆盖无效 OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove();

        modelBuilder.Entity<CONTACT>()
            .HasOptional(b => b.DBLINK)
            .WithMany()
            .HasForeignKey(b => new { b.ID_DBLINK, b.DBID_DBLINK });

        modelBuilder.Entity<CONTACT>()
        .HasKey(d => new { d.ID, d.DBID })
        .HasMany(d => d.CONTACTUSER)
        .WithRequired(d => d.CONTACT)
        .HasForeignKey(l => new { l.ID_CONTACT, l.DBID_CONTACT });

        modelBuilder.Entity<CONTACT>()
            .HasRequired(b => b.EMAILACCOUNT)
            .WithMany()
            .HasForeignKey(b => new { b.ID_EMAILACCOUNT, b.DBID_EMAILACCOUNT });

        modelBuilder.Entity<CONTACT>().HasKey(a => new { a.ID, a.DBID });
        modelBuilder.Entity<DBLINK>().HasKey(a => new { a.ID, a.DBID });
        modelBuilder.Entity<CONTACTUSER>().HasKey(a => new { a.ID, a.DBID });
        modelBuilder.Entity<EMAILACCOUNT>().HasKey(a => new { a.ID, a.DBID });

        base.OnModelCreating(modelBuilder);
    }

我现在正在寻找几天。相同的代码如何生成不同的 SQL 语句?

  1. IIS版本(开发PC:IIS 8,服务器IIS7.5)
  2. 两种环境都使用相同的数据库服务器(Firebird 2.5)
  3. 我将整个项目复制到服务器,没有任何变化......
  4. Projekt 设置为 .NET 4.5
  5. 我用这个函数创建了一个示例 WPF-Projekt,结果在服务器上使用了 RIGHT SQL
  6. FirebirdSql.Data.FirebirdClient.dll 版本 3.0.2.0 EntityFramework.dll 5.0.0

您知道什么会以这种方式影响查询创建吗?

4

0 回答 0