2017-09-16 8 views
2

私はwpfアプリケーションをやっていて、私はあなたに質問したいと思う少しの問題があります。Linqクエリを保存して後で使用する方法は?

私は窓レベル上のデータベースを照会していると私はこのように私のオブジェクトのメソッドにクエリの結果を渡す:

ウィンドウレベルのコード:

payrollEmailManager.SetListOfSalariesToEmailTo(
    from Record in SqlInfo.SqlTable.T_SALs 
    where Record.EtatPaie == 3 
    select new { 
     Matricule = Record.MatriculeSalarie, 
     Nom = Record.Nom, 
     Prenom = Record.Prenom, 
     Email = Record.EMail }); 

をこれは私の方法であり、定義:ListOfSalaryはタイプobjectでもある

public void SetListOfSalariesToEmailTo(object _ListOfSalaryToRecieveMail) 
{ 
    ListOfSalary = _ListOfSalaryToRecieveMail; 
} 

public void SendEmail() 
{ 
    foreach(var Salary in (dynamic)ListOfSalary) 
    { 
     Mail.To.Add(Salary.???? 
    } 
} 

今ここでは、私にとって問題である、私は私がlistofsalaryの各レコードの谷に行くと、私はMatriculeまたはEmail、このようなもののようなクエリで選択した情報を取得したい別の方法を持っていますNom列またはEmail列を参照できません。

+0

「参照できません」とはどういう意味ですか?試してみるとどうなりますか?動的な型定義を使用しているので、Intellisenseが*何かを提案することを期待するべきではありません。しかし、あなたは 'SendEmail'を呼び出すたびに毎回クエリを実行します。これを避けるには、クエリを*マテリアライズ*することができます。最後に 'ToList()'を呼び出すことによって( 'SetListOfSalariesToEmail'を呼び出します)。なぜあなたはこのすべてを動的にやっているのかは明らかではありません。あなたが必要とするすべての情報を持つ適切なタイプを使用してみませんか? –

+0

私はSQL DataAdapterを使用し、結果をデータテーブルに格納します。この場合、linqを使用する代わりに、コードの残りの部分にデータテーブルを渡すことができます。 – jdweng

答えて

5

あなたが次のクエリを検討している場合:

var query = from Record in SqlInfo.SqlTable.T_SALs 
      where Record.EtatPaie == 3 
      select new { 
       Matricule = Record.MatriculeSalarie, 
       Nom = Record.Nom, 
       Prenom = Record.Prenom, 
       Email = Record.EMail 
      }; 

クエリがデータベースにまだ実行されていない、この行を実行した後に。 ToList()/ToArray()/FirstOrDefaultなどの関数を使用して実体化した場合にのみ、実際にデータベース内で実行され、情報が返されます。

したがって、SomeFunction(query);を実行した場合、クエリは実行されず、後で実行するために保存することができます。

あなたのコードを変更するビットが必要ですしかし:あなたが後で必要にクエリを保存したいと

  • 関数は、オブジェクトが、IQueryable<T>

    public void SetListOfSalariesToEmailTo(IQueryable<T> query) 
    
  • を取得するべきではありません各項目の種類を知る。これを行うには、選択項目に匿名オブジェクト(new { })を使用しないでください。カスタムオブジェクトを代わりに使用してくださいまたはC#7.0という名前のタプルを使用して、関数が次のようになります。あなたはまだあなたがやったようobjectdynamicを使用して、ちょうどプロパティにアクセスすることができます

    var query = from Record in SqlInfo.SqlTable.T_SALs 
          where Record.EtatPaie == 3 
          select new SomeType { 
           Matricule = Record.MatriculeSalarie, 
           Nom = Record.Nom, 
           Prenom = Record.Prenom, 
           Email = Record.EMail 
          }; 
    
    public void SetListOfSalariesToEmailTo(IQueryable<SomeType> query) 
    { 
        ListOfSalary = query; 
    } 
    

が、あなたは具体的なタイプを知らないので、あなたにプロパティとオプションを示すインテリセンスはありません。

+0

@ Soufiane.Ach - これは問題の解決に役立ちましたか? –

関連する問題