2009-05-01 28 views
0

私はMVC Storefrontコードを使い、リポジトリ、サービス、およびpocoであるモデル(dbml/dataコンテキスト外)のパスに従おうとしています。私がテストを書くのを始めて、理解できないようなことが起こるまでは、実際に従うのはかなり簡単です。IQueryable、Where、Guid and

私の場合、主キーはintフィールドの代わりにuniqueidentifierです。

この場合
public IQueryable<Restaurant> All() 
{ 
    return from r in _context.Restaurants select new Restaurant(r.Id) 
     { 
      Name = r.Name 
     }; 
} 

、レストランはもちろんのModels.Restaurantであり、_context.Restaurants.Restaurantない:リポジトリはのIQueryableを返します。

サービスクラスのフィルタリング(またはリポジトリのユニットテストでは)すべてに対して、()、これは予想と同じように動作します:

var results = Repository.All().Where(r => r.Name == "BW<3").ToList(); 

これはうまく動作しますが、1 Model.Restaurantを持っています。人々は、R => r.Idが[モデルであるからだと言ういくつか似の記事を見た場合

The member 'BurningPlate.Models.Restaurant.Id' has no supported translation to SQL. 

:今、私はPKIDと同じことをしようとした場合:

var results = Repository.All().Where(r => r.Id == new Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")).ToList(); 

で失敗した場合。 Restaurants]は、linq2sql層が認識していないクラスレベルです。私にとっては、それは最初のバージョンがうまくいかないことを意味します。もちろん、私のpkがintの場合、それはうまく動作します。

ここで実際に何が起こっていますか?主は知っている、それは非常に直感的ではない1つの仕事と1つの仕事を持っている。私は何を誤解していますか?

答えて

0

ここでの問題は、コンストラクタのオーバーロードを使用し、それを埋めるためにクエリが必要であると考えていると思います。このようなプロジェクションを実行すると、プロジェクションクエリに含めるすべてのものを実際の投影そのもの。さもなければ、LinqはそれをSQLクエリに含めません。

ので、そのようなあなたのビットを書き換える:

return from r in _context.Restaurants select new Restaurant() 
     { 
      Id=r.Id, 
      Name = r.Name 
     }; 

これはそれを修正する必要があります。

+0

そして、それは私の問題でした。おかげでロブ! – claco

0

実際、アウトこのコードを入力したあなたは

VAR結果= Repository.All()。(R => r.Id.Equals(新しいGUID(「088ec7f4-63e8-4e3a-902Fを試しているわけではありません-fc6240df0a4b "))。ToListメソッド()

忍者

+0

まあ、はい、いいえ。 :-) 同じエラーでr => Equals(r.Id、new Guid())とEquals(r.Id、idvar)のバージョンを試しました。 私はr => r.Id.Equals(idvar)を試していません。私はそのバリエーションを見てきたとは言えません。 – claco

+0

Repository.All()。Where(r => r.Id.Equals(id))。ToList(); 同じエラーが発生します。 – claco

0

これはおそらく、クエリでGUIDをインスタンス化しようとしているという事実と関係している、と私は、LINQ to SQLは、実際にそれを変換しようとしていることを考えますオブジェクトが作成される前のSQLコード。

qクエリーではなく、クエリではありません。

+0

同じエラーが発生します。 var id = new Guid( "088ec7f4-63e8-4e3a-902f-fc6240df0a4b"); var results = Repository.All()。ここで(r => r.Id == id).ToList(); – claco