0

ここのドキュメントに基づいています: http://docs.composite.net/Data/AccessingDataWithCSharp/How-to-Query-Data-Using-LINQ#_How_to_Query

string[int1,int2,int3..] 型のフィルターを使用してテーブル内のデータをクエリする必要がありますが、その方法がわかりません。

string[] は、フォームの複数選択要素の ID 値を格納する別のテーブル フィールドから取得されます。

テーブル ' Profile ' (AGlobal.profile) には次の列が含まれます。

Id   Types(profile_accomtypes)
1    1,2
2    4,7
3    12,4,6
4    3,6,9

次に、合計 12 個の「Type」値をリストする静的テーブル「TypeDesc」(ALocal.proptype) を作成します。

Id   Description(proptype_names)
1     The first description
2     The second description
........
12    The twelfth description

クライアントからの送信時にフォームのコンテンツを簡単に処理できるように、厳密にコード化されたクラスを作成しました。フォーム内には複数の複数選択がありました (そのうちの 1 つはプロファイル データ型テーブルの「タイプ」です)。複数選択のそれぞれは、シリアル化された JSON 形式でサーバーに渡されます。 Profile.Types 列に保存する区切り記号。

ここで、Profile Id の Types string[] をロードし、int id 値を使用して TypeDesc テーブルをフィルター処理し、説明を含む Type 値のみを選択して、プロファイル ページの選択内容をクライアントに提供したいと考えています。クライアントの箇条書きリストとして。

プロファイル テーブルのフィルター タイプは常に id 整数です。使用しているコードは次のとおりです。

var myProftype =
   (from d in connection.Get<AGlobal.profile>() // find multiselected type string values
   where d.Id == StUserSet.utoken
   select d).First();
   string sProftype = myProftype.profile_accomtypes;                
   string[] sTypes = sProftype.Split(',');

// now filter proptypes to sTypes
var myTAccomtypes =
   (from d in connection.Get<ALocal.proptype>() // get all the types from the DB
   where(r => sTypes.Contains(r.Field<int>("Id"))) //Lambda ?
   select d).All;

StringBuilder sb = new StringBuilder(0); //create a bullet list string
// Loop over strings
    foreach (string s in myTAccomtypes)
    {
          sb.append("<dd>"+ s +"</dd>");
    }
   TuAccomtypes = sb.ToString();  // pass string to JQuery Taconite as part of AJAX response to alter DOM.

タイプをフィルタリングしようとしている Lambda でエラーが発生しました。 VS2010 では:

エラー = デリゲート型ではないため、ラムダ式を bool 型に変換できません。

また、フィルターが機能するように、sTypes変数をintに解析する方法もわかりません(必要な場合):(

どこが間違っていますか?db テーブル内の列フィールドからクエリされたコンマ区切りのリストに対してデータセットをフィルター処理するよりクリーンな方法はありますか?

事前に助けやアイデアをありがとう。マーティン。

4

2 に答える 2

2

あなたのモデルについては完全にはわかりませんが、これでうまくいくと思います。私はあなたのlinqを変更し、いくつかのステートメントを組み合わせました。Id フィールドを文字列にキャストして、array.Contains() 関数で正しく検出できるようにします。文字列を int にキャストしてその方法で比較するのとは逆のことをしたいかもしれませんが、それはあなた次第です。

    var myProftype = profiles.First(p => p.Id == StUserSet.utoken);
    string sProftype = myProftype.profile_accomtypes;
    string[] sTypes = sProftype.Split(',');
    var myTAccomtypes = propTypes.Where(r => sTypes.Contains(r.Field<int>("Id").ToString()));
    StringBuilder sb = new StringBuilder(0);

    foreach (PropType s in myTAccomtypes)
    {
        sb.Append("<dd>" + s.Description + "</dd>");
    }
于 2012-08-09T14:23:51.850 に答える
0

元の Linq クエリ (コンマで区切られた ID 番号の結合された文字列で単一のフィールドを識別) から文字列 var を分割すると、「含む」を適切に使用できませんでした。コレクションを評価する 2 番目の Linq クエリ ToList をキャストします。

次に、完全な結果を処理する代わりに、結果を id フィールドと name フィールドだけに制限しました。

Vimal Lakhera によって投稿された記事に依存します。

http://www.c-sharpcorner.com/uploadfile/VIMAL.LAKHERA/convert-a-linq-query-resultset-to-a-datatable/ 結果セットを DataTable に変換して、簡単にループしてフィールドを選択できるようにしましたJQuery Taconite コールバックの一部として html 文字列として出力します。

これが私にとってうまくいくものです...

// now filter proptypes to selected Types|
var myTAccomtypes = from d in connection.Get<ALocal.proptype>().ToList()
    // ToList() will evaluate collection, you cannot pass sTypes array of integers to a sql query, at least not in that way
    where sTypes.Contains(d.proptype_id.ToString())
    select new { d.proptype_id, d.proptype_name };

    DataTable AcomType = LINQToDataTable(myTAccomtypes);

    StringBuilder sb = new StringBuilder();
    // Loop over table rows
    foreach (var row in AcomType.Rows.OfType<DataRow>().Take(19))  // will .Take up to a maximum of x rows from above
    {
         sb.Append("<dd>");
         sb.Append(row["proptype_name"].ToString());
         sb.Append("</dd>");
     }
     HldUserSet.TuAccomtypes = sb.ToString();
     //HldUserSet.TuAccomtypes = string.Join(",", myTAccomtypes); //Check query content

Vimal の 'LINQToDataTable' を LINQ 要求の微調整と共に使用すると、サイトのさまざまな場所でクラスを非常に迅速に使用できるようになります。

これは、「2,7,14,16」の形式で結合された id の単一の文字列を持つものに対して機能し、分割してから、文字列の id に一致するより広いコレクションに対してフィルター処理して、id 番号を記録するために使用します。別のコレクションで。

于 2012-08-11T15:28:36.650 に答える