从LINQ C#中动态选择的表中获取表数据

时间:2014-09-08 13:45:00

标签: c#

我获得了一个表格参考:

 public static void MyDataGrabbingClass<T>(MyModelCls Model) where T : class
        {
            DataContext dc = new DataContext(Config.ConnectionString);
            //var ITable = (Devart.Data.Linq.ITable)dc.GetType().GetProperty(tableName).GetValue(dc, null);
            //var table = dc.GetTable(ITable.GetType());
            //var dataModel = dc.Mapping;
            //Type tableType = ITable.GetType();
            //var t = dc.Mapping.MappingSource.GetModel(typeof(DataContext)).GetMetaType(tableType);
            var table = dc.GetTable<T>();
        }

然后我想使用以下方法选择特定的数据列:

var Query = from c in table where Model.DateToColName  < Model.DateTo select (Model.ColSelections);

显然我需要以某种方式映射表列,而不是在where子句中使用Model.DateToColName,我该怎么做?

换句话说,使用我动态选择的表,如何从字符串列名称

获取列数据

1 个答案:

答案 0 :(得分:0)

不幸的是,我认为你无法在LINQ中构建动态查询(至少不容易)。看看Dapper.NET - 它是一个“.NET的简单对象映射器”,可能适合您,由StackOverflow的制造商创建。例如,使用Dapper.NET,您的方法可能如下所示:

public static void MyDataGrabbingClass<T>(MyModelCls Model) where T : class
{
   using (SqlConnection conn = new SqlConnecrion(Config.ConnectionString)
   {
       conn.Open();

       string tableName = ...;
       string dateToColumnName = ...;

       // depending on how dateToColumnName is constructed, ensure it is not a SQL-injection risk
       if (tableName.Any(c => !char.IsLetterOrDigit(c))
           throw new ArgumentException("Invalid table name.");
       if (dateToColumnName.Any(c => !char.IsLetterOrDigit(c))
           throw new ArgumentException("Invalid column name.");

       // Query is a
       var results = conn.Query<T>("SELECT * FROM [" + tableName + "] WHERE [" + dateToColumnName + "] < @DateTo", new { DateTo = someDate });

       ...

   }
}

安全问题:动态SQL很容易受到SQL注入的影响 - 因此请确保dateToColumnName变量不是来自用户输入,或者已经过适当的清理或验证。