c# - LINQ to Entities 查询数据表

标签 c# linq entity-framework datagridview datatable

我需要将从该 LINQ to Entities 查询(如下)返回的数据存储到 DataTable 中,以便我可以将其用作 DataGridView 的数据源,我该怎么做?

在这种情况下,我使用 LINQ to Entities 来查询 Entity Framework 概念模型,因此 db 是一个继承自 System.Data.Entity.DbContext.

using (TccContext db = new TccContext())
{
    var query = from vendedor in db.Vendedores.AsEnumerable()
                where vendedor.codigo == Convert.ToInt32(textBoxPesquisa.Text)
                select vendedor;
    // I'd like to do something like DataTable dt = query;
}

我已经尝试这样做(如下),但它在执行期间抛出异常 [1]。

using (TccContext db = new TccContext())
{
    IEnumerable<DataRow> query = (IEnumerable<DataRow>)(from vendedor in db.Vendedores.AsEnumerable()
                                                        where vendedor.codigo == Convert.ToInt32(textBoxPesquisa.Text)
                                                        select vendedor);

    using (DataTable dt = query.CopyToDataTable<DataRow>())
    {
        this.dataGridViewProcura.Rows.Add(
            dt.Rows[0][0],  // Código
            dt.Rows[0][1],  // Nome
            dt.Rows[0][2]); // Venda Mensal
    }
}

[1]:异常:InvalidCastException

Unable to cast object of type 'WhereEnumerableIterator`1[Projeto_TCC.Models.Vendedor]' to type 'System.Collections.Generic.IEnumerable`1[System.Data.DataRow]'.

提前致谢

最佳答案

这里有一件重要的事情,当您选择 IEnumerable<DataRow> 时,您将 Linq 查询转换为 ( vendedor) ,所以我假设供应商是 Vendedor 的一个实例,因此您的查询将返回 IEnumerable<Vendedor>

这应该可以解决您的问题,但您能否尝试使用生成的 DataTable 作为您的 DataGridView 的数据源?它会是这样的:

var query = (from vendedor in db.Vendedores.AsEnumerable()
                   where vendedor.codigo == Convert.ToInt32(textBoxPesquisa.Text)
                   select vendedor);
var dt = query.CopyToDataTable<Vendedor>();
this.dataGridViewProcura.DataSource = dt;

希望能帮到你!

编辑

作为附带说明(也是非常个人化的),您可以尝试在您的选择中使用 lambda,它们看起来更漂亮:)

var pesquisa = Convert.ToInt32(textBoxPesquisa.Text);
var query = db.Vendedores.Where(vendedor => vendedor.codigo == pesquisa);

var dt = query.CopyToDataTable<Vendedor>();
this.dataGridViewProcura.DataSource = dt;

干净多了,你不觉得吗?

编辑 2 我刚刚意识到您在 CopyToDataTable 上所说的仅适用于 DataRow,所以最后(诚然不是那么干净)的解决方案是模仿 helper 上的逻辑?

public DataTable CopyGenericToDataTable<T>(this IEnumerable<T> items)
{
    var properties = typeof(T).GetProperties();
    var result = new DataTable();

    //Build the columns
    foreach ( var prop in properties ) {
        result.Columns.Add(prop.Name, prop.PropertyType);
    }

    //Fill the DataTable
    foreach( var item in items ){
        var row = result.NewRow();

        foreach ( var prop in properties ) {
            var itemValue = prop.GetValue(item, new object[] {});
            row[prop.Name] = itemValue;
        }

        result.Rows.Add(row);
    }

    return result;
}

现在,需要考虑的事情:

  • 此解决方案不会处理复杂属性
  • 自定义生成的表格可能有点棘手

虽然这可能会解决问题,但我认为这不是一个很好的方法,但它可能是一个不错的想法的开始:)

希望这次能帮上忙!

关于c# - LINQ to Entities 查询数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18434598/

相关文章:

c# - 从 ContinueWith 中抛出异常

c# - 按字典顺序比较两个 char 数组

c# - LINQ 查询(按项目组分组)

entity-framework - Breeze.js 混合 DTO 和实体

c# - 使用传入的参数作为搜索字段使用 Entity Framework Web API 创建动态搜索查询

c# - 在 mvvm 中选择的列表框第一项

c# - 过滤数组列表内容的最佳方法是什么?

c# - LINQ:评估一个函数,其中数组元素按索引匹配

linq - IronPython 的表达式树

c# - 项目包含多个 EDMX 文件时抛出 "the entity type is not part of the model for the current context"错误