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.IQueryable1[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> 作为参数。