2016-08-12 4 views
0

データのバインドされたコントロールがあり、バンクのリストが設定されています。DataContextの空のエントリ

実アカウントの読み込み、挿入、削除の方法を理解できます。

しかし、フォーム上では、顧客は「なし」オプションを選択する方法を必要とします(顧客によっては現金が使用される)。

データテーブルが他のデータテーブルにリンクされているため、銀行データテーブルに「なし」エントリを挿入できません。

DataContextを返す前に "None"レコードを挿入しようとしましたが、このオプションは常にリストの一番上に表示されますが、コレクションにデータを取得する方法はないようです。

:それは に、TargetInvocationExceptionをスローするので、私はこれを使用することはできません、

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; 
} 

しかし:

public System.Data.Linq.Table<bank> Banks 
{ 
    get 
    { 
     return this.GetTable<bank>(); 
    } 
} 

は私が のIQueryableリストに偽のレコードを挿入することができました

タイプ 'System.Collections.Generic.List 1[Billing.DataDB.bank]' to type 'System.Linq.IQueryable 1 [Billing.DataDB.bank]'のオブジェクトをキャストすることができません。

DataContextディスプレイに空白のレコードを挿入するにはどうすればよいですか?

私は空のレコードをデータベースに入れたくありません。

答えて

2

あなたは、この二つの方法を修正することができます... IEnumerable<T>にメソッドの戻り値の型を変更、

まず

internal IEnumerable<bank> GetBankInfo(bool insertBlank = false) 

を...とreturn文でキャストを除外。 List<T>は、あなたの質問に記載された内容に基づきIEnumerable<T>

return list; 

を実装して、それは、冗長になるだろう、これは動作するはずです。

第二の方法:

あなたが本当に必要それは本当にIQueryable<T>を可能にするようなものは何でも、そのリスト/照会可能/で何かをやっている場合、それはさらに簡単です。それがあったように、関数の戻り値の型を残す:

internal IQueryable<bank> GetBankInfo(bool insertBlank = false) 

と戻り、この:私はIQueryableをリストに偽のレコードを挿入することができました

:ここ

return list.AsQueryable(); 

は問題です。

実際、あなたはそうではありませんでした。IQueryableの結果を新しいList<T>インスタンスに列挙しました。これはあなたのToList()呼び出しで発生したことです。これはキャストではなく、新しいコレクションオブジェクトを作成します。次に、偽レコードをList<T>に挿入しました。

IQueryable<bank>にキャスティングしていたものは、あなたが最初に起動したIQueryable<bank>ではありませんでした。それはIQueryable<bank>によって列挙されたすべてのアイテムを含む完全に異なるオブジェクトでした。

IQueryableの目的は、Entity Frameworkなどのように、実際のクエリをリモートで実行できるようにすることです。しかし、ToList()コールでクエリーを実現すると、遠隔の船はその駅から納屋を出ました。 IQueryable<T> inherits from IEnumerable<T>以来、私は後者を一般的な「もののシーケンスへの参照」タイプに使う傾向があります。パラメータにIEnumerable<T>を使用するメソッドは、IQueryable<T>を喜んで消費します。

+0

ありがとうございました!非常に良い説明と答えだけではありません。私は 'return list.AsQueryable();と一緒に行ったので、このライブラリを使用する他のものでも同じ機能が保証されています。とても有難い。 – jp2code

+0

返されたデータセットに「空白」値を持たせる最も良い方法はありますか? – jp2code

+0

@ jp2codeこれは私たちがやる方法です。私はより良いものを知らない。 –

関連する問題