我试图从IEnumerable Type返回dataTable值 任何人都可以帮助我如果我将为IEnumerable传递任何类型它将返回该值
IEnumerable<T> enrichment = null;
var dataTable = new DataTable();
using (ReconContext context = new ReconContext())
{
string sql = "SELECT * FROM " + DestinationTable + " WHERE LoadId =" + ExternalLoadId;
using (SqlDataAdapter adapater = new SqlDataAdapter(sql, context.Database.Connection.ConnectionString))
{
adapater.Fill(dataTable);
}
}
return enrichment;
答案 0 :(得分:1)
首先,除非确实需要,否则不需要使用通用定义。对于一般情况,您可以轻松使用DataRow,如下所示;
IEnumerable<DataRow> enrichment = null;
var dataTable = new DataTable();
using (ReconContext context = new ReconContext())
{
string sql = "SELECT * FROM " + DestinationTable + " WHERE LoadId =" + ExternalLoadId;
using (SqlDataAdapter adapater = new SqlDataAdapter(sql, context.Database.Connection.ConnectionString))
{
adapater.Fill(dataTable);
}
}
enrichment = dataTable.AsEnumerable();
return enrichment;
希望这有帮助。
答案 1 :(得分:0)
实体框架已允许您执行原始SQL查询并将其结果映射到SqlQuery的实体。您不需要使用原始ADO.NET。你可以写:
public IEnumerable<T> LoadSomeLoads<T>(string table,int loadId)
{
using (ReconContext context = new ReconContext())
{
var sq;="SELECT * FROM "+ table+ " WHERE LoadId = @p0";
var results= context.SqlQuery<T>(sql,loadId)
.ToArray();
}
}
您应该验证table
参数以确保它是允许的表名,否则有人可以查询他没有权限的表,或者只是通过强制表名来浏览数据。
您可以通过使用参数来避免灾难性的注入攻击,但如果有人可以强制查询不适当的表格,则不会阻止未经授权的泄露。
我怀疑你应该寻找每个类型的表继承。听起来你想从不同的表加载不同的类,其中至少有一个属性(LoadId)是常见的。
使用Table-per-Type EF将不同类型的继承层次结构映射到不同的表,并根据映射配置选择正确的表。
假设您有以下类别:
public abstract class LoadTypeBase
{
public int LoadId { get; set; }
...
}
[Table("LoadTableA")]
public class LoadTypeA : LoadTypeBase
{
...
}
[Table("LoadTableB")]
public class LoadTypeA : LoadTypeBase
{
...
}
和这个背景
public class ReconContext: DbContext
{
...
public DbSet<LoadTypeBase> Loads { get; set; }
}
您可以使用以下命令查询具有特定LoadId的所有加载类型:
var query = from someLoad in context.Loads
where someLoad.LoadId = loadId
select someLoad;
您可以使用OfType<T>()
var query = from someLoad in context.Loads.OfType<LoadTypeB>()
where someLoad.LoadId = loadId
select someLoad;
答案 2 :(得分:-1)
雅这是对的,但如果我的功能会这样,那么我如何使用datarow 我想把我将要通过的类型转出来
public IEnumerable<T> GeEnrichmendataByTableNameAndLoadId<T>(stringDestinationTable, int ExternalLoadId)