2016-11-03 3 views
0

Сначала я использую код EF 6.0 и наследование TPH в моем проекте. Я вижу, что если я использую поле enum в своих классах, EF генерирует инструкцию sql с кастингом. Поэтому мой запрос выполняется очень медленно, и производительность снижается. Как я могу удалить кастинг в моем sql-запросе?Entity Framework 6 Поле Enumer Enheritance Enum генерирует медленный запрос

Спасибо.

var db = new AppContext(); 
var p = db.Products.FirstOrDefault(x => x.ProdId == 1); 


public enum MyEnum 
{ 
    Field1 = 1, 
    Field2 = 2 
} 

public class Product 
{ 
    [Key] 
    public int ProdId { get; set; } 

    public string ProdName { get; set; } 

    //I run my code with this property and without this property. 
    //public MyEnum MyEnum { get; set; } 
} 

public class Chair : Product 
{ 
    public string ChairProp1 { get; set; } 
} 

public class Seat : Product 
{ 
    public string SeatProp1 { get; set; } 
} 

//EF generate this SQL without enum field. This is good SQL statements. 
SELECT TOP (1) 
[Extent1].[Discriminator] AS [Discriminator], 
[Extent1].[ProdId] AS [ProdId], 
[Extent1].[ProdName] AS [ProdName], 
[Extent1].[ChairProp1] AS [ChairProp1], 
[Extent1].[SeatProp1] AS [SeatProp1] 
FROM [dbo].[Products] AS [Extent1] 
WHERE ([Extent1].[Discriminator] IN (N'Chair',N'Seat',N'Product')) AND (1 = [Extent1].[ProdId]) 


//EF generate this SQL with enum field (myenum). there is alot of casting.i want to remove casting. 
SELECT 
[Limit1].[C1] AS [C1], 
[Limit1].[ProdId] AS [ProdId], 
[Limit1].[ProdName] AS [ProdName], 
[Limit1].[MyEnum] AS [MyEnum], 
[Limit1].[C2] AS [C2], 
[Limit1].[C3] AS [C3] 
FROM (SELECT TOP (1) 
    [Extent1].[ProdId] AS [ProdId], 
    [Extent1].[ProdName] AS [ProdName], 
    [Extent1].[MyEnum] AS [MyEnum], 
    CASE WHEN ([Extent1].[Discriminator] = N'Product') THEN '0X' WHEN ([Extent1].[Discriminator] = N'Chair') THEN '0X0X' ELSE '0X1X' END AS [C1], 
    CASE WHEN ([Extent1].[Discriminator] = N'Product') THEN CAST(NULL AS varchar(1)) WHEN ([Extent1].[Discriminator] = N'Chair') THEN [Extent1].[ChairProp1] END AS [C2], 
    CASE WHEN ([Extent1].[Discriminator] = N'Product') THEN CAST(NULL AS varchar(1)) WHEN ([Extent1].[Discriminator] = N'Chair') THEN CAST(NULL AS varchar(1)) ELSE [Extent1].[SeatProp1] END AS [C3] 
    FROM [dbo].[Products] AS [Extent1] 
    WHERE ([Extent1].[Discriminator] IN (N'Chair',N'Seat',N'Product')) AND (1 = [Extent1].[ProdId]) 
) AS [Limit1] 
+0

Можете ли вы обновить до 6.1.3? –

ответ

0

Кажется, вы пропустили конфигурацию дискриминатора. Вы должны указать, какие поля дискриминатор и что тип этого

Вы можете сделать это свободно апи так:

public class ChairConfig : EntityTypeConfiguration<Chair> 
{ 
    public ChairConfig() 
    { 
     this.Map(m => m.Requires(discriminator: "MyEnum").HasValue(MyEnum.Field1)); 
    } 
} 

public class SeatConfig : EntityTypeConfiguration<Seat> 
{ 
    public SeatConfig() 
    { 
     this.Map(m => m.Requires(discriminator: "MyEnum").HasValue(MyEnum.Field2)); 
    } 
} 

И в запросе нужно указать, какой тип вы хотите получить как это:

var db = new AppContext(); 
var p = db.Products.OfType<Chair>().FirstOrDefault(x => x.ProdId == 1); 
+0

Нет, это не проблема. Как вы видите, дискриминатор запрашивается. –

Смежные вопросы