如何使用Datable返回IEnumerable <t>值?

时间:2016-09-29 13:43:35

标签: c# asp.net linq-to-entities

我试图从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;

3 个答案:

答案 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)