Zig*_*gnd 5 c# linq datatable entity-framework datagridview
我需要将从这个LINQ返回的实体查询(下面)返回的数据存储到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;
}
Run Code Online (Sandbox Code Playgroud)
我试图这样做(下面),但它在执行期间抛出异常[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
}
}
Run Code Online (Sandbox Code Playgroud)
[1]:例外: InvalidCastException
Unable to cast object of type 'WhereEnumerableIterator`1[Projeto_TCC.Models.Vendedor]' to type 'System.Collections.Generic.IEnumerable`1[System.Data.DataRow]'.
Run Code Online (Sandbox Code Playgroud)
提前致谢
这里有一件重要的事情,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;
Run Code Online (Sandbox Code Playgroud)
希望我能帮忙!
编辑
作为旁注(也是非常个人的),您可以尝试在您的选择上使用 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;
Run Code Online (Sandbox Code Playgroud)
干净多了,你不觉得吗?
编辑2 我刚刚意识到您在 CopyToDataTable 上所说的仅适用于 DataRow,所以最后一个(诚然不是那么干净)解决方案是模仿助手上的逻辑?
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;
}
Run Code Online (Sandbox Code Playgroud)
现在,需要考虑的事情:
虽然这可能会解决问题,但我认为这不是一个很好的方法,但这可能是一个不错的想法的开始:)
希望这次我能帮上忙!
| 归档时间: |
|
| 查看次数: |
30500 次 |
| 最近记录: |