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

本文关键字:获取 数据 动态 LINQ 选择 | 更新日期: 2023-09-27 18:20:59

我获得了这样的表引用:

 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,我该怎么做?

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

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

中获取列数据

不幸的是,我认为您无法在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变量不是来自用户输入,或者经过了适当的清理或验证。