2017-02-08 6 views
7

Ich habe Mitarbeiter Tabelle mit bigint Primärschlüsselfeld in Datenbank und Entity-Datenmodell mit Datenbank ersten Ansatz. Employee-Klasse haben diese StrukturUnnötige Konvertierung in Bigint

public partial class Employee 
{ 
    public long Emp_No { get; set; } 
    public string Name { get; set; } 
    public string Family { get; set; } 
    ... 
} 

ich diese grundlegende Abfrage mit Entity Framework schreiben

List<long> ids = new List<long>() {1,2,3,4,5,6} 
database.Employees.Where(q => ids.Contain(q.Emp_No)).ToList(); 

Es Abfrage generieren, wie die folgenden:

SELECT 
    [Extent1].[Emp_No] AS [Emp_No], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Family] AS [Family], 
    ... 
    FROM [dbo].[Employee] AS [Extent1] 
    WHERE [Extent1].[Emp_No] IN (cast(0 as bigint), 
           cast(1 as bigint), 
           cast(2 as bigint), 
           cast(3 as bigint), 
           cast(4 as bigint), 
           cast(5 as bigint), 
           cast(6 as bigint)) 

Wie Sie sehen können gibt es nicht notwendig cast Bigint in Abfrage, während beide Arten von Emp_No und ids Array long sind, verursacht es schlechte Ausführungszeiten speziell wann immer ids Array hat viele Elemente.

Wie kann ich diese redundante Besetzung entfernen?

Antwort

3

es praktisch keine Kosten bei der Umwandlung sind cast(0 as bigint) und weil Emp_No ist auch ein bigint, wenn Sie nicht die Besetzung gibt die int noch zu einem Bigint gefördert werden haben müssen wäre in der Lage sein, um den IN Vergleich zu machen, so würde die Besetzung immer noch passieren, nur hinter den Kulissen.

Führen Sie die Nicht-Cast-Version der Abfrage selbst in Management Studio aus, und rufen Sie den tatsächlichen Ausführungsplan ab. Die Konvertierung wird weiterhin im Abfrageplan angezeigt.

-2

Nicht wirklich sicher, was Sie hier sind fragen, aber ..

Ihre lange ändern in int und die Abfrage sollten Sie statt Bigint einen int machen.

public partial class Employee 
{ 
    public int Emp_No { get; set; } 
    public string Name { get; set; } 
    public string Family { get; set; } 
    .... 
} 

Lange ist das Äquivalent von bigint. Sie können mehr hier lesen: What is the equivalent of bigint in C#?

+0

Ich kann das nicht tun .. Ich brauche lange Typ –