我获得了一个表格参考:
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,我该怎么做?
换句话说,使用我动态选择的表,如何从字符串列名称
获取列数据答案 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变量不是来自用户输入,或者已经过适当的清理或验证。