0

我正在通过 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,它就可以正常工作。

这里到底发生了什么?上帝知道,有一份工作,一份不工作并不是很直观。我有什么误解?

4

3 回答 3

0

没有实际输入此代码,您尝试过吗

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

忍者

于 2009-05-01T06:15:59.350 回答
0

这可能与您尝试在查询中实例化 guid 的事实有关,我认为 LINQ to SQL 正在尝试在创建对象之前将其转换为实际的 SQL 代码。

尝试在查询之前而不是在查询上实例化。

于 2009-05-01T06:26:44.987 回答
0

我认为这里的问题是由于使用了构造函数重载,并期望查询来填充它。当你做这样的投影时,你必须把所有你想在投影查询中的东西放在实际投影本身中. 否则,Linq 不会将其包含在 SQL 查询中。

所以,像这样重写你的位:

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

这应该解决它。

于 2009-05-08T01:12:29.600 回答