2016-11-13 3 views
-1

エンティティへのLINQでサポートされているのみパラメータなしのコンストラクタは、しかし、私はそれで問題かはどのように私はそれを解決することができいただきまし理解しない、私は私のLINQ文でこのエラーを持っている

int year = 2016; 
     int month = 11; 
     DateTime dateFrom = new DateTime(year, month, 1); 
     DateTime dateTo = dateFrom.AddMonths(1); 
     int daysInMonth = DateTime.DaysInMonth(year, month); 
     var data = db_pdv.Pdv.Where(x => x.Fecha >= dateFrom && x.Fecha < dateTo); 

     var model_pdv = data.GroupBy(x => new { Pdv = x.Clave_PDV, Nombre_Pdv = x.Nombre_Pdv, Turno = x.Turno, Nombre_Turno = x.Nombre_Turno, Pla_ID = x.Platillo, Nombre_Platillo = x.Nombre_Platillo, Precio = x.Precio }) 
      .Select(x => new DishVM() 
      { 
       Clave_PDV = x.Key.Pdv, 
       Nombre_Pdv = x.Key.Nombre_Pdv, 
       Turno = x.Key.Turno, 
       Nombre_Turno = x.Key.Nombre_Turno, 
       Platillo = x.Key.Pla_ID, 
       Nombre_Platillo = x.Key.Nombre_Platillo, 
       Precio = x.Key.Precio, 
       Days = new List<int>(new int[daysInMonth]), 
       Data = x 
      }).ToList(); 

そして、これはどのように私はこの問題を解決することができます

public class DishVM 
{ 
    public string Clave_PDV { get; set; } 
    public string Nombre_Pdv { get; set; } 
    public string Turno { get; set; } 
    public string Nombre_Turno { get; set; } 
    public int Platillo { get; set; } 
    public string Nombre_Platillo { get; set; } 

    [DisplayFormat(DataFormatString = "{0:C}")] 
    public decimal Precio { get; set; } 
    public List<int> Days { get; set; } 
    [Display(Name = "Quantity")] 
    public int TotalQuantity { get; set; } 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    [Display(Name = "Total")] 
    public decimal TotalPrice { get; set; } 
    public IEnumerable<Pdv> Data { get; set; } 
} 

私の "DishVM" クラスですか? ありがとうございます。

+0

エラーは何ですか? – Cologler

答えて

3

どうすればこの問題を解決できますか?問題が何であるかを知ることによって

スタート。

Entity Frameworkでは、db_pdv.PdvのようにDbSetで動作する式はすべてSQLに変換されます。 全体の表現。あなたの場合、この「全体表現」はmodel_pdvで、db_pdv.Pdv.Where(...).GroupBy(...).Select()という構造になっています。式にはnew List<int>(new int[daysInMonth])が含まれます。これをSQLに変換することは不可能であることがわかります。どのようにデータベースエンジンは。NET List<T>オブジェクトを構築する方法を知っていますか?

どのように解決するのですか?

あなた最初のリストを構築し、式を作成できます

... 
var daysList = new List<int>(new int[daysInMonth]); 
var data = db_pdv.Pdv.Where(... 
     ... 
     Precio = x.Key.Precio, 
     Days = daysList, 
     Data = x 

今、あなたはSQLにプリミティブ値(整数)を変換するSQLの翻訳作業を削減しました。 EFはそれをどうやって完璧に行うかを知っています。しかし結果は...面白いです。生成されたSQLをチェックすると、EFは整数のリストをある種のSQLテーブルに変換することがわかります。どのように見える...

CROSS JOIN (SELECT 
     0 AS [C1] 
     FROM (SELECT 1 AS X) AS [SingleRowTable1] 
    UNION ALL 
     SELECT 
     0 AS [C1] 
     FROM (SELECT 1 AS X) AS [SingleRowTable2] 
    UNION ALL 
     SELECT 
     0 AS [C1] 
     FROM (SELECT 1 AS X) AS [SingleRowTable3] 
    UNION ALL 
     ... 

...など。複雑 -

ここに何が起こる

は、基本的には、C#でリストに結果セットを、C#でリストを作成するSQL構文に変換し、データベースが結果セットを構築してみましょう、変換です。

別のオプションは、メモリ内に文全体を実行することです:

var data = db_pdv.Pdv.Where(x => x.Fecha >= dateFrom && x.Fecha < dateTo) 
       .AsEnumerable(); 
var model_pdv = ... 

通常の理由はhereを説明するために、私は、このアプローチを提唱していません。しかし、この場合、最終的にすべてのデータ(Data = x)を使用するため、データベースから必要以上にフェッチしないため、OKです。

より深いソリューションは、完全にビューモデルからリストを削除することです。冗長性は不整合の母です。なぜすべてのモデルインスタンスが同じ整数リストを必要とするのでしょうか? UIを表示するために必要な場所で一度だけリストを構築できるはずです。

関連する問題