我使用typed DataSets
来访问数据,通过DataSet Designer
配置它们(本教程解释了一般思想(。
对于每个表,首先会自动创建一个GetData()
方法。它返回与数据库中的基础表具有相同架构(即列(的DataTable
。如果现在我使用 'Add query'
选项创建一个自定义方法,该方法应该只返回部分数据(例如六列中的三列(,则自动生成的方法返回的 DataTable 仍然由六列组成,而其中三列不包含任何数据。
这有一个烦人的副作用,例如,当我将此DataTable
绑定到 GridView(显然使用 ObjectDataSource(时,这些空列也出现在GridView
中,所以我必须手动删除它们。
相关问题是,如果我使用来自另一个表的数据添加到相应的SQL-query
列(例如使用内部联接或子查询(,则相反,这些列不会添加到 GridView 中,尽管我可以在Boundfield
中手动绑定它们。
因此,如果这里有人没有完全迁移到实体框架,并且可以解释这种行为并帮助克服这些问题,我将非常感谢您的回答。提前谢谢你。
更新:
我的期望是找到从 SQL 查询之上的数据集设计器创建的 get 方法获取DataTable
的方法,该方法将在其架构中反映此查询的结果。在教程中,他们说GetData()
方法为您创建并填充 DataTable,并将其作为方法的返回值返回。所以直观地为什么不创建一个带有匹配字段的新表。
所以我希望我做错了什么。或者我的期望是错误的,但有人可以解释我,为什么。
我没有尝试过这个,但我想你可以通过将数据表结果转移到另一种已知类型并相应地绑定网格来解决这些问题。 (我知道这没什么意义,请耐心等待...
举个例子(尽管使用非类型化数据集(:
编辑 - 已为您交换为 C#:
EDIT2 - 哇,在线转换器让我大失所望 - 重新输入,所以它现在实际上可以编译
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
public class myView
{
public string OrderNumber { get; set; }
public int Quantity { get; set; }
public decimal PricePerUnit { get; set; }
public decimal TotalPrice { get; set; }
}
public void SO9(System.Data.DataTable mockTypedDatatable)
{
IEnumerable<myView> results = mockTypedDatatable.AsEnumerable().Select(n => new myView {
OrderNumber = Convert.ToString(n["OrderNumber"]),
Quantity = Convert.ToInt32(n["Quantity"]),
PricePerUnit = Convert.ToDecimal(n["Price"])});
results.ToList().ForEach(x => x.TotalPrice = x.Quantity * x.PricePerUnit);
myGridView.DataSource = results;
myGridView.DataBind();
}
在示例中,我将假装数据表中的列分配给某些属性,而其他属性则通过其他方式填充(在示例中,只需乘以 Quanty * Price,但您可以轻松地扩展它(。
希望有帮助
我可以说我已经找到了解决它的方法。
解释是,相应的 TableAdapter 通过其任何 GetData(( 方法(包括自定义方法,如 GetReductionSetOfData(((创建和返回的不仅仅是通用数据表,而是完全类型的数据表(例如,在我的例子中为 CarSetsDataTable(。也许这正是我忽略的强类型数据集的本质。
在我看来,解决方案很容易。您不必使用可能修改的数据模式作为现有 DataAdapter 中的返回值创建新的自定义方法,而是为同一数据库表创建其他 DataAdapter,这将使用默认 GetData(( 方法准确返回您需要的其他自定义 SQL 查询的结果。
我不知道创建许多 DataAdapter 是否会有任何副作用,但这似乎是一种安全的方法,可以毫不费力地从类型化数据集中获取所需的数据。