2011-01-18 10 views
2

これはもともとthis questionの応答として投稿しましたが、新しいものを求めていたはずです。しかし、空のテーブルの上に、countは、デバッガでステップ実行しながら、全体0のままとgetCountryが実行後nullあるSubmitChangesより前のLINQ-to-SQLのオブジェクト

int count = Db.Countries.Count(); 
Country newCountry = new Country{Name = "France"}; 
Db.Countries.InsertOnSubmit(c); 
Country getCountry = Db.Countries.FirstOrDefault(x => x.Name == "France"); 
count = Db.Countries.Count(); 
Db.Countries.DeleteOnSubmit(c); 
count = Db.Countries.Count(); 

:私は次の操作を行うことができるはず示唆しているようです。

私には何が欠けていますか?

+0

これは少し外れていますが、Count()操作は非常に重いですか?私はそれが行の量をカウントするデータベースクエリを作成することを理解しています。たぶんそれをリストに変換してから、Count()でCountを取る方が速いのですか? – Tx3

+1

'Count()'はリストに変換して、その中のオブジェクトを数えるよりも速いです。 'select count(1)from Country'は' select x、y、z from Country'より速くなり、結果を数えます。 – enashnash

答えて

2

LINQ-to-SQLは、データベース内のデータとローカルに保持されているオブジェクトの間で、そのネットワーク内に位置します。その時点で、データベースに変更を提出していません(Db.SubmitChanges())。これらはローカルにしか存在しません。 、そしてその答えは0

です。これは、データベースの世界に対してローカルデルタをアップと結婚しようとする(一般的なケースでは)めちゃくちゃ難しいだろう -

Db.Countries.Count()は、データベース(すなわちselect COUNT(1) from Countries)で実行されますだから短く:それをしないでください。それは動作しません。

+0

さて、私はそれを得るために、より良い言い回しの質問があったと思いますが、なぜMyObject newObject = db.MyObjects.Where(o => o.Id == 1).SingleOrDefault();元の質問からは大丈夫ですが、Count()はそうではありませんか? – enashnash

+0

@enashnash実際には、元の質問ではIdの一致はしませんが、そこには手間がかかります; pアイデンティティマネージャ(read:cache)があります。 DBはそれを見ます。これは**ラウンドを避けるために '。{First | Single} [OrDefault](pkid-match)'と '.Where(pkid-match)。{First | Single} [OrDefault] -旅行。このキャッシュに対して 'Id == 1'クエリ**をローカルに**実行しています。 –

+0

クールです。その場合、次のコマンドを実行すると、最後に 'c == null 'が表示されるのはなぜですか? \t \t \t国c =新しい国{Id = 123}; \t \t \t Db.Countries.InsertOnSubmit(c); \t \t \t c = Db.Countries.FirstOrDefault(x => x.Id == 123); – enashnash

関連する問題