DataContext 的空白条目
Blank Entry for DataContext
我们有一个填充有银行列表的数据绑定控件。
我可以弄清楚如何读取、插入和删除真实帐户。
然而,在表格上,我们的客户需要一种方法来 select "None" 选项(一些客户使用现金)。
由于数据 table 与其他数据 table 的链接方式,我无法将 "None" 条目插入银行数据 table。
我试图在返回 DataContext 之前插入一条 "None" 记录,以便此选项始终出现在列表的顶部,但似乎没有任何方法可以将数据放入collection.
public System.Data.Linq.Table<bank> Banks
{
get
{
return this.GetTable<bank>();
}
}
我能够将假记录插入到 IQueryable 列表中:
internal IQueryable<bank> GetBankInfo(bool insertBlank = false)
{
var list = (from item in banks
orderby item.bank_name
select item).ToList();
if (insertBlank)
{
var item = new bank()
{
bank_name = String.Empty,
contact_name = String.Empty,
contact_phone_num = String.Empty,
routing_num = "None",
source = String.Empty,
fact_routing_num = String.Empty,
note_id = (int?)null,
};
list.Insert(0, item);
}
return (IQueryable<bank>)list;
}
但是,我不能使用它,因为它会抛出 TargetInvocationException:
Unable to cast object of type 'System.Collections.Generic.List1[Billing.DataDB.bank]' to type 'System.Linq.IQueryable
1[Billing.DataDB.bank]'.
如何为 DataContext 显示插入空白记录?
我不想要数据库中的空白记录。
您可以通过两种方式解决此问题:
首先,将方法的 return 类型更改为 IEnumerable<T>
...
internal IEnumerable<bank> GetBankInfo(bool insertBlank = false)
...并在 return
语句中省略演员表。这将是多余的,因为 List<T>
实现了 IEnumerable<T>
return list;
根据您在问题中提到的内容,这应该可行。
第二种方式:
如果你正在用那个 list/queryable/whatever 做其他事情,以至于你真的 需要 它真的是 IQueryable<T>
,那就更容易了。保持函数 return 类型不变:
internal IQueryable<bank> GetBankInfo(bool insertBlank = false)
和return这个:
return list.AsQueryable();
这是问题所在:
I was able to insert a fake record into an IQueryable list:
实际上,你不是。您将 IQueryable
的结果枚举到一个新的 List<T>
实例中:这就是您的 ToList()
调用中发生的情况。它不是演员表,它创建了一个新的集合对象。然后你在 List<T>
中插入了一条假记录。
您投射到 IQueryable<bank>
的东西不是您开始时使用的 IQueryable<bank>
;它是一个完全不同的对象,其中包含 IQueryable<bank>
枚举的所有项目。
IQueryable
的目的是让实际查询可以远程执行,例如 Entity Framework。但是,一旦您在 ToList()
调用中具体化了查询,远程船就会驶出谷仓。由于 IQueryable<T>
inherits from IEnumerable<T>
,我倾向于将后者用于一般的 "reference to sequence of things" 类型。任何采用 IEnumerable<T>
作为参数的方法都会愉快地使用 IQueryable<T>
作为参数。
我们有一个填充有银行列表的数据绑定控件。
我可以弄清楚如何读取、插入和删除真实帐户。
然而,在表格上,我们的客户需要一种方法来 select "None" 选项(一些客户使用现金)。
由于数据 table 与其他数据 table 的链接方式,我无法将 "None" 条目插入银行数据 table。
我试图在返回 DataContext 之前插入一条 "None" 记录,以便此选项始终出现在列表的顶部,但似乎没有任何方法可以将数据放入collection.
public System.Data.Linq.Table<bank> Banks
{
get
{
return this.GetTable<bank>();
}
}
我能够将假记录插入到 IQueryable 列表中:
internal IQueryable<bank> GetBankInfo(bool insertBlank = false)
{
var list = (from item in banks
orderby item.bank_name
select item).ToList();
if (insertBlank)
{
var item = new bank()
{
bank_name = String.Empty,
contact_name = String.Empty,
contact_phone_num = String.Empty,
routing_num = "None",
source = String.Empty,
fact_routing_num = String.Empty,
note_id = (int?)null,
};
list.Insert(0, item);
}
return (IQueryable<bank>)list;
}
但是,我不能使用它,因为它会抛出 TargetInvocationException:
Unable to cast object of type 'System.Collections.Generic.List
1[Billing.DataDB.bank]' to type 'System.Linq.IQueryable
1[Billing.DataDB.bank]'.
如何为 DataContext 显示插入空白记录?
我不想要数据库中的空白记录。
您可以通过两种方式解决此问题:
首先,将方法的 return 类型更改为 IEnumerable<T>
...
internal IEnumerable<bank> GetBankInfo(bool insertBlank = false)
...并在 return
语句中省略演员表。这将是多余的,因为 List<T>
实现了 IEnumerable<T>
return list;
根据您在问题中提到的内容,这应该可行。
第二种方式:
如果你正在用那个 list/queryable/whatever 做其他事情,以至于你真的 需要 它真的是 IQueryable<T>
,那就更容易了。保持函数 return 类型不变:
internal IQueryable<bank> GetBankInfo(bool insertBlank = false)
和return这个:
return list.AsQueryable();
这是问题所在:
I was able to insert a fake record into an IQueryable list:
实际上,你不是。您将 IQueryable
的结果枚举到一个新的 List<T>
实例中:这就是您的 ToList()
调用中发生的情况。它不是演员表,它创建了一个新的集合对象。然后你在 List<T>
中插入了一条假记录。
您投射到 IQueryable<bank>
的东西不是您开始时使用的 IQueryable<bank>
;它是一个完全不同的对象,其中包含 IQueryable<bank>
枚举的所有项目。
IQueryable
的目的是让实际查询可以远程执行,例如 Entity Framework。但是,一旦您在 ToList()
调用中具体化了查询,远程船就会驶出谷仓。由于 IQueryable<T>
inherits from IEnumerable<T>
,我倾向于将后者用于一般的 "reference to sequence of things" 类型。任何采用 IEnumerable<T>
作为参数的方法都会愉快地使用 IQueryable<T>
作为参数。