【问题标题】:IQueryable, Where, Guid andIQueryable、Where、Guid 和
【发布时间】:2023-03-21 20:24:02
【问题描述】:

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

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

【问题讨论】:

    标签: linq-to-sql guid iqueryable


    【解决方案1】:

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

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

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

    这应该可以解决问题。

    【讨论】:

    • 确实,这是我的问题。谢谢罗!
    【解决方案2】:

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

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

    忍者

    【讨论】:

    • 嗯,是的,也不是。 :-) 我尝试了相同错误的 r=>Equals(r.Id, new Guid()) 和 Equals(r.Id, idvar) 版本。我没有尝试过 r=>r.Id.Equals(idvar)。我不能说我见过这种变化。
    • Repository.All().Where(r => r.Id.Equals(id)).ToList();同样的错误。
    【解决方案3】:

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

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

    【讨论】:

    • 同样的错误。 var id = new Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b"); var results = Repository.All().Where(r => r.Id == id).ToList();
    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多