9

クエリを実行するテーブルを動的に選択して、LINQ を使用して動的にクエリを作成できるかどうかを調べる必要があります。

これは私がすることの例です:

//Not working,just for example

public List<dynamic> _getGenericList(String tableName)
    {
        var l = from a in db.//I need to use here tableName
                  select a;

        return l.ToList<dynamic>();
    }

これを可能にする方法はありますか?

4

5 に答える 5

3

クエリがこのように単純な場合、標準の sql ステートメントを動的に作成して実行できます。これは、プロセッサの重いリフレクションと複雑なコードを使用しない最も簡単な方法ですか?

var query = "SELECT * FROM " + tableName;
var res = context.ExecuteQuery<dynamic>(query).ToList();
于 2013-01-07T17:19:09.433 に答える
1

それを行う方法を見つけましたが、このコードを使用するかどうかはわかりません。2 つのテーブルを含む DataContext がある場合:

PrimaryTable 
    ID,
    FirstValue,
    SecondValue

SecondaryTable
    ID,
    FirstSecondaryValue

次の DataHelper クラスを使用できます。

class DataHelper
{
    public MyDatabaseDataContext db = new MyDatabaseDataContext();

    List<dynamic> GetDynamicList<T>() where T : class
    {
        System.Data.Linq.Table<T> table = db.GetTable<T>();

        var result = from a in table select a;

        return result.ToList<dynamic>();
    }

    public List<dynamic> GetWhatIWant(string tableName)
    {
        Type myClass = Type.GetType("DynamicLinqToSql." + tableName);
        MethodInfo method = typeof(DataHelper).GetMethod("GetDynamicList", BindingFlags.NonPublic | BindingFlags.Instance);
        method = method.MakeGenericMethod(myClass);
        return (List<dynamic>)method.Invoke(this, null);
    }
}

次に、DataHelper のインスタンスを作成し、テーブル名を渡して GetWhatIWant メソッドを呼び出すことができます。

var dataHelper = new DataHelper();

List<dynamic> myFirstList = dataHelper.GetWhatIWant("PrimaryTable");

for (int i = 0; i < 5 && i < myFirstList.Count; i++)
{
    System.Console.WriteLine(String.Format("{0} - {1}", myFirstList[i].FirstValue.ToString(),  myFirstList[i].SecondValue.ToString()));
}

List<dynamic> mySecondList = dataHelper.GetWhatIWant("SecondaryTable");

for (int i = 0; i < 5 && i < mySecondList.Count; i++)
{
    System.Console.WriteLine(mySecondList[i].FirstSecondaryValue.ToString());
}

System.Console.ReadKey();
于 2013-01-07T18:42:35.483 に答える
0

これが古いことは知っていますが、私のように答えを探しているなら、これが役立つかもしれません. DataContextデータ ソースの代わりに.NET ObjectContextを直接使用しています。DataContext バージョンを使用している場合は、代わりに使用するだけで (願っています)、同じように機能すると確信しています。queryResults = myGlobalContext.ExecuteQuery<dbGenericData>(query).ToList();

次のような命名とデザインの基準があれば、テーブルの操作がずっと簡単になります。

  • テーブルの ID フィールドは常に X タイプ (INT、GUID など)
  • ID フィールドは常に tableNameID という名前で、ID がタグ付けされた「テーブル名」です。
  • 等、

これにより、「ID」文字列をテーブル名に追加するだけで ID フィールドを簡単に作成でき、必要に応じて信頼できる CAST を使用できるようになります。

CAST といえば、クエリ文字列にあることに気付くでしょう。データベースからさまざまなタイプのデータを取得することを克服するには、CAST を使用して SQL 文字列の使用を変更したり、nvarChar(50) の例のようにフィールド長を変更したりする必要があります。

最後の注意: クエリ文字列では、'AS' キーワードを使用して DB フィールドを新しい名前にキャストしていることがわかります。「tableIDField」を「id」という名前にキャストし、「requestedField」を「dbData」という名前にキャストしました。これにより、システムは名前が変更されたフィールドを DB から、データをダンプする STRUCT オブジェクト コンテナーに一致させることができます。これにより、DB フィールド名との一致を心配することなく、返されたデータを保持する汎用コンテナを構築できます。

私はこのようなことの第一人者ではありませんが、これが誰かに役立つことを願っています.

private void testMethod(string requestedField, string tableName)
{
    var tableIDField = tableName + "ID";

    var query = "select " + tableIDField + " as id, CAST(" + requestedField + "as nvarchar(50)) as dbData from " + tableName;

    List<dbGenericData> queryResults = null;

    try
    {
        queryResults = myGlobalContext.ExecuteStoreQuery<dbGenericData>(query).ToList();
    }
    catch (Exception ex)
    {
        //Simply ignore any exceptions.  
        //These will need examined to determine best solution to unexpected results.
    }
}
private struct dbGenericData
{
    public dbGenericData(int id, string dbData)
    {
        this = new dbGenericData();
        ID = id;
        DBData = dbData;
    }

    public int ID { get; set; }

    public string DBData { get; set; }

}
于 2020-03-25T15:38:58.943 に答える
-2
var esql = "TypeName から t を t として選択"
var q = db.CreateQuery(esql);

linq to sql にはエンティティ sql を使用します ( http://esql.codeplex.com )。

于 2013-03-09T18:41:06.590 に答える