0

次のようなクエリを取得するために文字列フィールドを使用して Linq to SQL で動的比較を行う方法:

"SELECT COLUMN_1, COLUMN_2" +
"FROM "+ stringTABLE +
"WHERE " + stringCOLUMN_1_or2  + " = ' " + 8 + "'";

私はこれができることを知っています:

from x in objects
where x.COLUMN_1 == "8"
select x

ただし、FIELD は変数であり、COLUMN_1 または COLUMN_2 などにすることができます...

Windowsフォーム(フレームワーク4.0)でやりたいことの例として

from x in objets
where x.field[stringCOLUMN_1_or2] == "8"
select x

どうすればこれを行うことができますか?前もって感謝します

4

5 に答える 5

3

通常、LINQ to SQLは列と同じ名前のプロパティを作成するため、LINQは次のようになります。

from x in objets
where x.stringCOLUMN_1 == 8.ToString()
select x;
于 2013-01-11T19:33:31.183 に答える
1

オブジェクトまたはフィールド コレクションが何であるかはわかりませんが、文字列比較の場合は、最初にリテラルを引用符で囲む必要があります。

from x in objets
where x.field[stringCOLUMN_1] == "8"
select x

通常、列名はプロパティとして表されます。

from x in objets
where x.stringCOLUMN_1 == "8"
select x

最後に、通常、DBContext があり、特定のテーブルを選択するためにドリルダウンする必要があります。

from x in db.TableNameHere
where x.stringCOLUMN_1 == "8"
select x

コードのコンテキストをさらに確認しないと、より多くの提案を提供することは困難です。

より動的なものを探している場合は、拡張メソッドを使用して追加の where 基準を追加できることに注意してください。

var query = from x in db.TableNameHere select x;
if(ShouldFilterColumn1)
  query = query.Where(x => x.Column1 == "8");

var results = query.ToList();

コードのコンテキストをさらに確認しないと、より多くの提案を提供することは困難です。

于 2013-01-11T19:36:39.993 に答える
0

あなたはを使用してそれを行うことができますExpressionTree

方法:式ツリーを使用して動的クエリを作成する(C#およびVisual Basic)

Expressionを使用してネストされたクラスを使用して述語を作成します。ここで、MarcGravellの答えは単純で実行可能に見えます。

更新: LinqToSqlの場合、上記のリンクは役に立ちません。

Trispedの答え(2番目のオプション)を見てください、それは役立つかもしれません。

于 2013-01-11T20:13:38.357 に答える
0

リフレクションを使用できると思います:

from x in db.TableName
    where (x.GetType().GetProperty(stringCOLUMN_1_or2).GetValue(x, null)) == " 8"
    select x;

ただし、それを行う簡単なLinqishの方法があるかどうかはわかりません...

編集:動的Linqが機能すると仮定すると、次のようになります:

from x in objets
.Where(stringCOLUMN_1_or2  + " = ' " + 8 + "'")
select x

ここにSQLを使用した動的Linqに関する詳細情報があります:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-ライブラリ.aspx

于 2013-01-11T20:16:19.867 に答える
0

3つの可能性が考えられます。

1 つ目は動的 LINQ です。私はこれを一度調べましたが、それほど遠くには行きませんでした。

2 番目のオプション (AaronLS による提案と同様) は、一度に 1 ステップずつクエリを作成することです。これは私が最も頻繁に使用するオプションです。
: select または order 句の前に where 句を追加する必要があります。そうしないと、実行時に例外が発生します。

var query = from x in objects;
switch (columnIndicator)
{
    case ColumnIndicatorTypes.Column1:
        query = query.Where(x => x.Column1 == "8");
        break;
    case ColumnIndicatorTypes.Column2:
        query = query.Where(x => x.Column2 == "8");
        break;
    case ColumnIndicatorTypes.Column3:
        query = query.Where(x => x.Column3 == "8");
        break;
    case ColumnIndicatorTypes.Column4:
        query = query.Where(x => x.Column4 == "8");
        break;
}

3 番目のオプションは、すべてのオプションをコーディングすることです。例えば:

switch (columnIndicator)
{
    case ColumnIndicatorTypes.Column1:
        query = from x in objects
            where x.COLUMN_1 == "8"
            select x;
        break;
    case ColumnIndicatorTypes.Column2:
        query = from x in objects
            where x.COLUMN_2 == "8"
            select x;
        break;
    case ColumnIndicatorTypes.Column3:
        query = from x in objects
            where x.COLUMN_3 == "8"
            select x;
        break;
    case ColumnIndicatorTypes.Column4:
        query = from x in objects
            where x.COLUMN_4 == "8"
            select x;
        break;
    default:
        query = from x in objects
            select x;
        break;
}

生成されたクエリを確認したい場合は、クエリをdb.Log実行する前に接続するか ( のようなものdb.Log = New System.IO.StringWriter(New StringBuilder()))、サーバーでプロファイラーを実行するか (SQL Server Profiler など)、オブジェクトを文字列にキャストすることをお勧めします (これは文字列を返すと思いますクエリのバージョンですが、しばらく経ちました)。

于 2013-01-11T20:19:33.943 に答える