繁体   English   中英

如何返回IEnumerable <T> 使用Datable的价值?

[英]How to return the IEnumerable<T> Value using Datable?

我正在尝试从IEnumerable类型返回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;

首先,除非确实需要,否则不需要使用泛型定义。 在一般情况下,您可以轻松使用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;

希望这可以帮助。

实体框架已经允许您执行原始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)是常见的。

通过按类型表, 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;

是的,这是正确的,但是如果我的功能喜欢这样,那么我将如何使用数据行,我想输出将通过的类型,将重新调整类型

 public IEnumerable<T> GeEnrichmendataByTableNameAndLoadId<T>(stringDestinationTable, int ExternalLoadId)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM