2016-09-15 12 views
1

がサポートされていません。クエリ演算子は、「ToDictionary」私は辞書を取得するには、次のクエリを使用しています

using (JSEADataContext dc = new JSEADataContext(JSEADBContext.GetConnectionstring())) 
       { 
        var Incident = (from incident in dc.Incidents 
             from main in dc.Mains.Where(inv => inv.ReportID == incident.reportid).DefaultIfEmpty() 
             from teamApproval in dc.TeamsAndApprovals.Where(inv => inv.ReportID == incident.reportid).DefaultIfEmpty() 
             where incident.reportid == "123123" 
             orderby incident.reportid ascending 
             select new Data 
             { 
     AssessmentFormCount = (from assessmentCount in dc.Table1 
                   join panel in dc.Table2 on assessmentCount.lng_ID equals panel.lng_id 
                   into temp 
                   from j in temp.DefaultIfEmpty() 
                   where assessmentCount.ReportID == main.ReportID 
                   group j by j.str_desc into grouping 
                   select new AssessmentFormCheckedCount 
                    { 
                     str_Panel = grouping.Key, 
                     lng_Count = grouping.Count() 
                    }).AsEnumerable().ToDictionary(id => id.str_Panel, id => id.lng_Count) }).ToList<Data>().SingleOrDefault(); 
} 



public class AssessmentFormCheckedCount 
    { 
     public string str_Panel { get; set; } 
     public int lng_Count { get; set; } 
    } 

public class Data : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
     #region Assessment Count 
     private AssessmentFormCheckedCount _AssessmentFormCount { get; set; } 
     public AssessmentFormCheckedCount AssessmentFormCount 
     { 
      get 
      { 
       return this._AssessmentFormCount; 
      } 
      set 
      { 
       if ((this._AssessmentFormCount != value)) 
       { 

        this._AssessmentFormCount = value; 
        this.NotifyPropertyChanged("AssessmentFormCount"); 

       } 
      } 
     } 
     #endregion 
} 

問題:

私は取得していますこれを実行しようとしています

クエリ演算子 'ToDictionary'はサポートされていません

ここで私は間違っています。

+0

'ToDictionary'その後、' ToList'その後、 'SingleOrDefault'?それは奇妙な組み合わせです。 – user3185569

+0

ご覧のとおり、私はサブクエリとして使用しています。これは、単一オブジェクトの場合、異なるパネルに対して複数のカウントがあることを意味します。 – Sunny

+1

SubQueryで 'ToDictionary'を使うことはできません。 Linq-To-SQLでは、外部クエリと内部クエリの両方がOne-Goで実行されるためです。これでプロバイダは内部クエリをSQLに変換することができません!あなたは、あなたの質問を考え直すか、Linq-2-SQLを使ってストアドプロシージャを呼び出す必要があります。それは単一の値を返すための1つの巨大なクエリです! – user3185569

答えて

0

問題は、あなたがIQueryable<T>.ToDictionary(id => id.str_Panel, id => id.lng_Count) })を呼び出すようにしようとしているということです、それは、SQLサーバー上で実行されている、およびSQLコマンドにToDictionaryを変換する方法はありません。

有効なC#コードであっても、有効なSQLに変換することはできません。必要なのは、IQueryable<T>をSQLに変換できることを確認してから、結果に.ToList()(または.ToArray())を呼び出してメモリに取り込みます。その後、.ToDictionary(...)に電話することができます。このような

何か:

var Incident = 
(
    from incident in dc.Incidents 
    from main in dc.Mains.Where(inv => inv.ReportID == incident.reportid).DefaultIfEmpty() 
    from teamApproval in dc.TeamsAndApprovals.Where(inv => inv.ReportID == incident.reportid).DefaultIfEmpty() 
    where incident.reportid == "123123" 
    orderby incident.reportid ascending 
    select 
    (
     from assessmentCount in dc.Table1 
     join panel in dc.Table2 on assessmentCount.lng_ID equals panel.lng_id 
     into temp 
     from j in temp.DefaultIfEmpty() 
     where assessmentCount.ReportID == main.ReportID 
     group j by j.str_desc into grouping 
     select new 
     { 
      str_Panel = grouping.Key, 
      lng_Count = grouping.Count() 
     } 
    ) 
).Take(1).ToList(); 

var result = 
    Incident 
     .Select(xs => xs.ToDictionary(id => id.str_Panel, id => id.lng_Count)) 
     .ToList(); 
+0

ありがとうございました。 – Sunny

0

今私は同じクエリを含むクエリの代わりに1つのメソッドを呼び出していますが、今は正常に動作しています。ここ

using (JSEADataContext dc = new JSEADataContext(JSEADBContext.GetConnectionstring())) 
       { 
        var Incident = (from incident in dc.Incidents 
             from main in dc.Mains.Where(inv => inv.ReportID == incident.reportid).DefaultIfEmpty() 
             from teamApproval in dc.TeamsAndApprovals.Where(inv => inv.ReportID == incident.reportid).DefaultIfEmpty() 
             where incident.reportid == "123123" 
             orderby incident.reportid ascending 
             select new Data 
             { 
     AssessmentFormCount = test(main.str_ReportID, dc) }).ToList<Data>().SingleOrDefault(); 
} 




private Dictionary<string, int> test(string ReportID, DataContext dc) 
    { 
     var ceck = (from assessmentCount in dc.AssessmentForms.AsEnumerable() 
        join panel in dc.masters.AsEnumerable() on assessmentCount.lng_ID equals panel.lng_id 
        into temp 
        from j in temp.DefaultIfEmpty() 
        where assessmentCount.ReportID == ReportID 
        group j by j.desc into grouping 
        select new AssessmentFormCheckedCount 
         { 
          str_Panel = grouping.Key, 
          lng_Count = grouping.Count() 
         }).ToList(); 
     var t = ceck.ToDictionary(p => p.str_Panel, p => p.lng_Count); 
     return t; 
    } 
+1

このメソッドは、テストメソッドがすでに.ToList()を呼び出しているため、既にクエリを実行して、Enumerableリストを返すために機能します。 –

+0

@サニー - あなたはなぜあなた自身の質問に無回答で答えましたか?これを削除し、これを編集の最後に追加する必要があります。 – Enigmativity

+0

ありがとう@HarrisYer。 – Sunny

関連する問題