IQueryable,Where,Guid和

时间:2009-05-01 05:56:15

标签: linq-to-sql guid iqueryable

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

这里到底发生了什么?主知道,拥有一件工作而一件工作不是很直观。我误解了什么?

3 个答案:

答案 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
        };

这应该解决它。