2016-07-07 30 views
0

do-whileループでSQLクエリ結果をループしようとしていますが、結果変数のインデックスに問題があります。SQLクエリ結果のエラー:クエリ演算子 'ElementAt'はサポートされていません

問題がwhile (selectQuery.ElementAt(i).Source != user.Item1 && selectQuery.ElementAt(i).UserID != user.Item2 && i<selectQuery.Count());

でライン上にあるので、私の質問は:どのように私は、インデックス、SQLクエリ結果の変数をすることができますか?

は、ここに私のコードです:

 //------------------Database connection initialization-------------------------- 
     string m_dbConnestionString = "Server=aaa; Database=bbb; uid=ccc; pwd=ddd; Trusted_Connection=True;" 
     DataClasses1DataContext db = new DataClasses1DataContext(m_dbConnectionString); 
     Table<Central> m_myTable = db.GetTable<Central>() 
     // -----------------------------------------------------------------------------    

     int i = -1; 

     var selectQuery = 
      from central in m_myTable 
      select central; 


     foreach (var row in selectQuery) 
     { 
      Console.WriteLine("{0}; {1}",row.DisplayName, row.Email); 
     } 


     foreach (var user in allMailusers) // btw, allMailUsers is List<Tuple<string, string, string, string, string>> 
     { 

      do 
      { 

       i += 1; 

      } while (selectQuery.ElementAt(i).Source != user.Item1 && selectQuery.ElementAt(i).UserID != user.Item2 && i<selectQuery.Count()); 

      if (selectQuery.ElementAt(i).Source != user.Item1 && selectQuery.ElementAt(i).UserID != user.Item2) // if true, insert into DB 
      { 
       // create new instance of Central 
       Central c1 = new test1.Central(); 

       // fill up c1 with values 
       c1.UserID  = selectQuery.ElementAt(i).UserID; 
       c1.Source  = selectQuery.ElementAt(i).Source; 
       c1.DisplayName = selectQuery.ElementAt(i).DisplayName; 
       c1.Email  = selectQuery.ElementAt(i).Email; 
       c1.Phone  = selectQuery.ElementAt(i).Phone; 

       // insert into db 
       m_myDb.Centrals.InsertOnSubmit(c1); 
       m_myDb.SubmitChanges(); 

      } // end if 

      i = -1; 
     } // end of foreach 

答えて

3

まず第一に、(あなたが式をLINQの結果の型である)あなたがIQueryableの上に列挙するたびに、あなたは再びデータベースをヒットしていることに注意してください。代わりに、

var result = selectQuery.ToArray(); 

または類似のものを実行して、クエリのローカルキャッシュを取得します。

これを実行すると、result.ElementAtが機能し、データベースを1回だけヒットします。

例:

foreach (var row in result) 
{ 
    Console.WriteLine("{0}; {1}",row.DisplayName, row.Email); 
} 

あなたはIQueryableElementAtを使用しようとしていたので、Entity Frameworkのは、したがって、エラー、それを行う方法を知っていない、SQLコマンドの中にそれを翻訳しようとしていました。

関連する問題