这个LINQ出了什么问题

时间:2010-09-17 20:15:57

标签: c# linq-to-sql

我有一个简单的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);

2 个答案:

答案 0 :(得分:1)

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

因此,EF LINQ提供程序不知道如何将Object.Equals()转换为一大块SQL。

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

但在这种特殊情况下,只需使用==就可以了解它。

答案 1 :(得分:0)

  1. 检查SupportDbDTO是否可序列化
  2. 而不是返回IQuerable返回一个数组(SupportDbDTO [])