我有一个简单的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);
答案 0 :(得分:1)
我假设您正在使用实体框架?实体框架的LINQ提供程序将采用您的LINQ查询并直接将其转换为SQL。 LINQ to SQL可能做同样的事情,但我从未使用它。
因此,EF LINQ提供程序不知道如何将Object.Equals()
转换为一大块SQL。
最简单的答案是执行您在其他地方已经在做的事情,将查询转换为带有AsEnumerable()
的枚举,然后从那时起不再是EF查询而是LINQ to Objects查询,以及整个LINQ现在都可以工作,代价是必须将整个查询从数据库中拉入内存。
但在这种特殊情况下,只需使用==
就可以了解它。
答案 1 :(得分:0)