2009-05-01 67 views
0

我正在通過MVC Storefront代碼工作並嘗試遵循存儲庫,服務和poco模型,而不是dbml/data上下文的路徑。實際上很容易,直到我開始編寫測試,並且以我不明白的方式失敗。IQueryable,Where,Guid和

在我的情況下,主鍵是一個uniqueidentifier而不是一個int字段。該庫返回一個IQueryable:

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

在這種情況下,餐廳當然是Models.Restaurant,而不是_context.Restaurants.Restaurant。

過濾服務類(或庫單元測試)對所有的(),這個作品只是預期:

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

這只是正常,有一個Model.Restaurant。現在,如果我嘗試用PKID同樣的事情:

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

如果與失敗:

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

如果看到了一些similiar帖子裏的人說,這是因爲R => r.Id爲[模型。餐廳]是linq2sql層不知道的課程級別。對我而言,這意味着第一個版本也不應該起作用。當然,如果我的pk是一個int,它就可以工作。

這裏究竟發生了什麼?上帝知道,做一件事,一件不行,不是很直觀。我誤解了什麼?

回答

0

我認爲這裏的問題是由於使用構造函數重載,並期望查詢來填充它。當你做這樣的投影時,你必須把所有你想要的東西放在投影查詢中實際投影本身。否則,Linq將不會在SQL查詢中包含該內容。

所以,重寫你的位,如下所示:

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

這應該修復它。

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 2009-05-01 12:51:25

+0

Repository.All()。其中​​(r => r.Id.Equals(id))。ToList(); 同樣的錯誤。 – claco 2009-05-01 23:10:27

0

這可能與事實,你試圖實例在查詢中的GUID來辦,而且我認爲LINQ to SQL中試圖將其轉換成實際創建對象之前的SQL代碼

嘗試在q之前實例化uery而不是查詢。

+0

同樣的錯誤。 var id = new Guid(「088ec7f4-63e8-4e3a-902f-fc6240df0a4b」); var results = Repository.All()。其中​​(r => r.Id == id).ToList(); – claco 2009-05-01 12:49:45