我正在通过 MVC Storefront 代码工作,并尝试在 dbml/data 上下文之外遵循存储库、服务和 poco 模型的路径。实际上这很容易理解,直到我开始编写测试并且事情以我不理解的方式失败。
在我的例子中,主键是一个 uniqueidentifier 而不是一个 int 字段。存储库返回一个 IQueryable:
public IQueryable<Restaurant> All()
{
return from r in _context.Restaurants select new Restaurant(r.Id)
{
Name = r.Name
};
}
在这种情况下,Restaurant 当然是 Models.Restaurant,而不是 _context.Restaurants.Restaurant。
针对 All() 在服务类(或存储库单元测试)中过滤,这正如预期的那样工作:
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.
如果看到一些类似的帖子,人们说这是因为 r => r.Id is [Model.Restaurants] 是 linq2sql 层不知道的类级别。对我来说,这意味着第一个版本也不应该工作。当然,如果我的 pk 是一个 int,它就可以正常工作。
这里到底发生了什么?上帝知道,有一份工作,一份不工作并不是很直观。我有什么误解?