2011-06-19 2 views
1

私はこれで私の頭を壊しているし、あなたと私の問題を共有することにしました いくつかのテーブルから匿名の選択を作成したい、それらのいくつかは複数の結果を含むかもしれません。あるlinq:select句でメソッドを使用

var resultTable = from item in dc.table 
        select new 
        { 
         id= item.id, 
         name= CreateString((from name in item.Ref_Items_Names 
           select name.Name).ToList()), 
        }; 

とCreateString():私はこのような何かをした1つの文字列 にこれらの結果を連結したい私の意図は一覧表示するには、「名前」クエリを変換することであった

private string CreateString(List<string> list) 
{ 
    StringBuilder stringedData = new StringBuilder(); 
    for (int i = 0; i < list.Count; i++) 
    { 
    stringedData.Append(list[i] + ", "); 
    } 
    return stringedData.ToString(); 
} 

とそれをCreateString()に送り、それを1つの長い連結文字列に変換します。

私は、.Aggregate((current、next)=> current + "、" + next);を使ってみました。私は以下のようなデータテーブルに私のクエリを変換しようとすると しかし:私は「dc.GetCommand()は、」集計方法でクエリを理解できないという例外を取得しています

public DataTable ToDataTable(Object query) 
{ 
    DataTable dt = new DataTable(); 
    IDbCommand cmd = dc.GetCommand(query as IQueryable); 
    SqlDataAdapter adapter = new SqlDataAdapter(); 
    adapter.SelectCommand = (SqlCommand)cmd; 
    cmd.Connection.Open(); 
    adapter.Fill(dt); 
    cmd.Connection.Close(); 
    return dt; 
} 

を 後で私もこれを使用しようとしました単純なクエリ:

var resultTable = from itemin dc.table 
        select new 
        { 
         name = CreateString() 
        }; 

何が「名前」に挿入されなかった、()が「成功」を返すCreateString select句でメソッドを使用する方法がない理由 ? ありがとうございます Yotam

答えて

1

LINQとオブジェクトとLINQ to some-db-providerには違いがあります。一般に、IQueryableを使用する場合は、プロバイダが理解できるものを除き、どのメソッドも使用できません。あなたは何ができるか

は、データベースからデータを取得し、オブジェクトにLINQを使用して書式設定を行うことです。

var data = from item in dc.table 
      where /* some condition */ 
      select item; 

var result = from item in data.AsEnumerable() 
      select new 
      { 
       name = SomeFunction(item) 
      } 

オブジェクトにLINQを使用して処理するAsEnumerable()拡張メソッド部隊。

+0

すばやくお返事ありがとうございますが、問題は私が反復せずにIEumerableをDataTableに変換できないことです。私はそれをIQuerableに変換しようとしましたが、私は空のテーブルを得続けています – Yotam

+0

反復処理の問題は何ですか?それがIEnumerableの目的です! – svick

+0

問題は時間です、私は12000行が時間がかかる可能性があり、私は反復時間を保存するためにquaryでそれを行うことを望んだが、私はこれらの値を挿入する必要があるときに各行のDBから抽出する必要がある30値を挿入していますIQuerableまたはIEnumerableのToDataTable()メソッドはありません。 – Yotam

0

あなたの質問を誤解してしまったら、私に許してください。あなたがやろうとしているのは、再利用のための抽象メソッドです。この場合、ラムダ式を使用して投影を検討することができます。

internal static class MyProjectors 
{ 
    internal static Expression<Func<Object1, ReturnObject>> StringDataProjector 
    { 
     get 
     { 
      return d => new Object1() 
      { 
       //assignment here 
      } 
     } 
    } 
} 

今、あなたのようなあなたのデータセットを選択することができます。例:連結ロジックについては

dc.Table.Select(MyProjectors.StringDataProjector) 

を、どのようなIEnumerable<string>財産とする読み取り専用のプロパティで、いくつかの基本クラスに選択について文字列の連結を処理する?

関連する問題