我正在研究MVC店面代码,并尝试在dbml / data上下文之外遵循存储库,服务和poco模型的路径。实际上很容易理解,直到我开始编写测试并且事情以我不理解的方式失败。
在我的例子中,主键是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。
在针对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 =&gt; r.Id是[Model.Restaurants]是linq2sql层不知道的类级别。对我来说,这意味着第一个版本也不应该工作。当然,如果我的pk是一个int,它就可以正常工作。
这里到底发生了什么?主知道,拥有一件工作而一件工作不是很直观。我误解了什么?
答案 0 :(得分:0)
实际上没有输入此代码,您试过吗
var results = Repository.All()。where(r =&gt; r.Id.Equals(new Guid(“088ec7f4-63e8-4e3a-902f-fc6240df0a4b”))。ToList()
忍
答案 1 :(得分:0)
这可能与您尝试在查询中实例化guid的事实有关,我认为LINQ to SQL正在尝试在创建对象之前将其转换为实际的SQL代码。
尝试在查询之前进行实例化,而不是在查询上进行实例化。
答案 2 :(得分:0)
我认为这里的问题是由于使用构造函数重载,并期望查询填充它。当你做这样的投影时,你必须将你想要的所有东西放在投影查询中实际投影本身。否则Linq将不会在SQL查询中包含它。
所以,像这样重写你的位:
return from r in _context.Restaurants select new Restaurant()
{
Id=r.Id,
Name = r.Name
};
这应该解决它。