1

、、、などのParameters列を含むIdテーブルがあります。データベースには複数の「シリーズ データ」テーブルも含まれており、1 つの列を含む数列、場合によっては数百列の列があります。私は db スキーマを所有していません。だから私はこれを変えることはできません。NameTableNameColumnNameTimestamp

ユーザーは、GUI を使用して、、、およびをName指定する必要があります。ビジネス ロジックは、一連のデータを返す必要があります。ParameterStartTimeEndTime

param.TableNameと という名前の列とテーブルにあるデータを取得するにはどうすればよいparam.ColumnNameですか?

現在、次のような switch ステートメントを使用しています。

public List<double> GetData
                    (string paramName, DateTime startTime, DateTime endTime)
{
    using (var context = new MyEntities())
    {
        var param =
            (from p in context.Parameters where p.Name == paramName select p)
            .FirstOrDefault();

        switch (param.TableName)
        {
             case "Table1":
                 return GetTable1Data(columnName, startTime, endTime);
                 break;
             case "Table2":
                 return GetTable2Data(columnName, startTime, endTime);
                 break;
             default:
                 throw new Exception();
        }
    }
}

private List<double> GetTable1Data
   (MyEntities context, string columnName, DateTime startTime, DateTime endTime) {

    List<double> data = new List<double>();

    switch (columnName)
    {
        case "Parameter1":
            (from d in context.Table1 where d.Timestamp >= startTime && d.Timestamo <= endTime
            order by d.Timestamp select d).ForEach(x => data.Add(d.Parameter1));
            break;
        case "Parameter2":
            (from d in context.Table1 where d.Timestamp >= startTime && d.Timestamo <= endTime
            order by d.Timestamp select d).ForEach(x => data.Add(d.Parameter2));
            break;
       case "Parameter3":
           (from d in context.Table1 where d.Timestamp >= startTime && d.Timestamo <= endTime
           order by d.Timestamp select d).ForEach(x => data.Add(d.Parameter3));
           break;
       default:
           throw new Exception("");
    }

    return data;
}

private List<double> GetTable2Data(MyEntities context, string columnName, DateTime startTime, DateTime endTime)
{
    List<double> data = new List<double>();

    switch (columnName)
    {
        case "Parameter1":
            (from d in context.Table2 where d.Timestamp >= startTime && d.Timestamo <= endTime
            order by d.Timestamp select d).ForEach(x => data.Add(d.Parameter1));
            break;
        case "Parameter2":
            (from d in context.Table2 where d.Timestamp >= startTime && d.Timestamo <= endTime
            order by d.Timestamp select d).ForEach(x => data.Add(d.Parameter2));
            break;
        case "Parameter3":
            (from d in context.Table2 where d.Timestamp >= startTime && d.Timestamo <= endTime
            order by d.Timestamp select d).ForEach(x => data.Add(d.Parameter3));
            break;
        default:
             throw new Exception("");
    }

    return data;

}

この重複は非常に間違っているようです。

より良い方法はありますか?

4

1 に答える 1

1

文字列形式の情報を使用してクエリを作成し、次のように実行できます。

return db.ExecuteStoreQuery<double>(
    "SELECT {0} FROM {1} WHERE [Timestamp] BETWEEN {2} AND {3}",
    columnName,
    tableName,
    startTime,
    endTime).ToList();

ピート

于 2012-06-19T20:51:44.143 に答える