【问题标题】:What's wrong with this LINQ这个 LINQ 有什么问题
【发布时间】:2011-07-15 22:42:59
【问题描述】:

我有一个简单的 DTO,我试图通过 RIAServices 返回,但我不断收到此错误: “查询的加载操作失败。无法创建“System.Object”类型的常量值。此上下文仅支持原始类型。

查询方法如下:

public IQueryable<SupportDbDTO> GetDbsRelatedToModel(string modelDtoId)
{
    IQueryable<SupportDb> query; 

    var key = new Guid(modelDtoId);
    var siteId = _context.SupportDbs.Single(db => db.Id.Equals(key)).SiteDbId ?? Guid.Empty;

    query = _context.SupportDbs
       .Where(db => !db.Id.Equals(key))
       .Where(db => db.DBType == DB.CATALOG_DB || db.DBType == DB.CATALOG_SCHEMA_DB || db.DBType == DB.MODEL_DB)
       .Where(db => db.SiteDbId.Equals(siteId))
       .OrderBy(db => db.DBName);

    return query.AsEnumerable()
        .Select(db => new SupportDbDTO
        {
         Id = db.Id.ToString(),
         DBName = db.DBName,
         DBType = db.DBType,
         PlantRoot = db.PlantRoot,
         DBSize = db.DBSize ?? 0,
         ModifiedDate = db.ModifiedDate ?? DateTime.Now       
        }).AsQueryable();
}

我通过使用 == 而不是 Equals 来实现它。这是有问题的:

query = _context.SupportDbs
    .Where(db => db.Id != key)
    .Where(db => db.DBType == DB.CATALOG_DB || db.DBType == DB.CATALOG_SCHEMA_DB || db.DBType == DB.MODEL_DB)
    .Where(db => db.SiteDbId == siteId)
    .OrderBy(db => db.DBName);

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    我假设您使用的是实体框架? Entity Framework 的 LINQ 提供程序将获取您的 LINQ 查询并将其直接转换为 SQL。 LINQ to SQL 可能会做同样的事情,但我从未使用过它。

    所以 EF LINQ 提供程序不知道如何将 Object.Equals() 转换为 SQL 块。

    最简单的答案是做你已经在其他地方做的事情,将查询转换为带有AsEnumerable() 的可枚举,然后从那时起它不再是 EF 查询而是 LINQ to Objects 查询,然后整个LINQ 现在可以工作了,代价是必须将整个查询从数据库中拉出到内存中。

    但在这种特殊情况下,仅使用 == 似乎就可以解决问题。

    【讨论】:

    • 同时做query.AsEnumerable().Foo().Bar().AsQueryable()有点适得其反。一旦调用了AsEnumerable,您就不再在数据库中,因此调用AsQueryable 并没有多大作用。你可以返回一个IEnumerable(RIA 服务会处理得很好)
    • 谢谢,我确实意识到发布此内容后...rgds
    【解决方案2】:
    1. 检查 SupportDbDTO 是否可序列化
    2. 不是返回 IQuerable,而是返回一个数组 (SupportDbDTO[])

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      相关资源
      最近更新 更多