2014-01-10 35 views
0

如何從此查詢的第一部分(Select p +> new ...)中投影模型,進入ResultsVM視圖模型(Select(p => new ResultsVM ....)?附加信息:實體或複雜類型'cb2.Models.ResultsVM'不能在LINQ to Entities查詢中構造

當我在下面嘗試時,出現以下錯誤:其他信息:無法構造實體或複雜類型'cb2.Models.ResultsVM'在

一個的LINQ to Entities查詢我知道我必須投射到另一個匿名類型,所以必須更換:

.Select(p => new ResultsVM.Select(p => new - 但我的觀點是期待ResultsVM不是anonymouse類型。

任何想法如何解決這個問題?

謝謝

馬克

  var qas = db.QAs.Include(q => q.Analyst).Where(x => x.date >= from && x.date < to); 

     var res = qas.GroupBy(p => p.Analyst.AgentName) 
    .Select(p => new 
    { 
     AnalystId = p.Key, 
     Analyst = p.FirstOrDefault().Analyst.AgentName, 
     CorrectP = p.Where(x => x.priority == 1).Count(), 
     WrongP = p.Where(x => x.priority == 0).Count(), 
     CorrectA = p.Where(x => x.assignment == 1).Count(), 
     WrongA = p.Where(x => x.assignment == 0).Count(), 
     CorrectS = p.Where(x => x.solution == 1).Count(), 
     WrongS = p.Where(x => x.solution == 0).Count() 
    }) 
    .Select(p => new ResultsVM 
    { 
     AnalystId = p.AnalystId, 
     Analyst = p.Analyst, 
     CorrectP = p.CorrectP, 
     WrongP = p.WrongP, 
     Pp = p.CorrectP + p.WrongP != 0 ? p.CorrectP * 100.0/(p.CorrectP + p.WrongP) : 0, 
     CorrectA = p.CorrectA, 
     WrongA = p.WrongA, 
     Ap = p.CorrectA + p.WrongA != 0 ? p.CorrectA * 100.0/(p.CorrectA + p.WrongA) : 0, 
     CorrectS = p.CorrectS, 
     WrongS = p.WrongS, 
     Sp = p.CorrectS + p.WrongS != 0 ? p.CorrectS * 100.0/(p.CorrectS + p.WrongS) : 0 

    }).ToArray(); 

結果VM:

public class ResultsVM 
{ 
    public int Id { get; set; } 
    public string AnalystId { get; set; } 
    public string Analyst { get; set; } 
    public int CorrectP { get; set; } 
    public int WrongP { get; set; } 
    public double Pp { get; set; } 
    public int CorrectA { get; set; } 
    public int WrongA { get; set; } 
    public double Ap { get; set; } 
    public int CorrectS { get; set; } 
    public int WrongS { get; set; } 
    public double Sp { get; set; } 

} 

奇怪的是,此代碼的工作沒有示數,而據我所看到的,是試圖做同樣的事情:

  var res = scores2.GroupBy(p => p.AnalystId) 
     .Select(p => new 
     { 
      AnalystId = p.Key, 
      Analyst = p.FirstOrDefault().Analyst.AnalystName, 
      score = p.Sum(x => x.Score), 
      taskcount = p.Count() 
     }) 
     .Select(p => new ObjectiveScoreVM 
     { 
      AnalystId = p.AnalystId, 
      Analyst = p.Analyst, 
      Score = p.taskcount != 0 ? p.score * 100.0/p.taskcount : 0, 
      TasksMet = p.score, 
      TaskCount = p.taskcount 
     }) 
     .ToArray(); 

謝謝,馬克

+0

嗨 - 我不認爲它是重複的,因爲其他問題不能解決我的問題。我已經添加了一些更多的問題。謝謝,Mark – Mark

+0

ResultsVm是EF實體還是ObjectiveScoreVM不是?請指定哪些是EF模型上的實體,哪些不是。 – JotaBe

+0

嗨 - 兩者都只是ViewModels - 它們不映射到任何數據庫表。謝謝,馬克 – Mark

回答

0

當您執行LINQ to Entities查詢時,編譯器會嘗試將查詢轉換爲EF模型中的查詢。有時候,當你這樣做時,它會失敗,因爲你試圖做一些EF模型中無法完成的事情。

在這種情況下,違規操作是第二次投影(Select)。我無法確定發生這種情況的原因。我需要更多信息。

如果你想避免這種失敗,你只需要將違規投影(第二個Select)從LINQ移動到實體到LINQ到對象(這更靈活)。

要做到這一點,兌現你的第一部分查詢,與ToList()或任何其他的是「執行」查詢,並返回一個對象的集合,但不包括HTE違規部分(第二Select)。

現在,當您處理第一個查詢的結果時,您正在處理一組對象,因此您使用的是LINQ to Objects,它更加靈活,並允許您執行之前的Faling投影。

相關問題