我正在尝试一些我不确定的事情,但我想在这里询问是否有可能。
能够完成吗?
public IQueryable<Info> GetInfo(int count, byte languageId)
{
return db.Info.SelectMany(i => i.LanguageInfo)
.Where(l => l.Language.id == languageId)
.Select(l => new Info { AddDate = l.Info.AddDate,
Description = l.Description,
EntityKey = l.Info.EntityKey,
id = l.Info.id,
Title = l.Title,
ViewCount = l.Info.ViewCount }
)
.OrderByDescending(i => i.id)
.Take(count);
}
执行此方法时出现错误
实体或复杂类型 'GuideModel.Info'不能 在LINQ to Entities中构建 查询。
这是否意味着“不可能”?
谢谢
答案 0 :(得分:3)
该错误实质上表明实体框架不知道如何创建Info对象,因为它未绑定到表对象。 (换句话说,Select
上的IQueryable
调用无法转换为等效的SQL。)您可以通过以下方式在客户端上执行Select
投影:
public IQueryable<Info> GetInfo(int count, byte languageId)
{
return db.Info.SelectMany(i => i.LanguageInfo)
.Where(l => l.Language.id == languageId)
.Take(count)
.AsEnumerable()
.Select(l => new Info { AddDate = l.Info.AddDate,
Description = l.Description,
EntityKey = l.Info.EntityKey,
id = l.Info.id,
Title = l.Title,
ViewCount = l.Info.ViewCount }
)
.OrderByDescending(i => i.id);
}
答案 1 :(得分:2)
可以使用Select(l => new ...)
,但不能使用实体类型。您需要使用匿名类型或POCO类型与无参数构造函数。实体类型是“特殊的”,因为它们与ObjectContext交互的方式。您可以选择它们,但不能在查询中新建它们。
答案 2 :(得分:0)
以下代码对我有用。这里“SearchTerm”是一个复杂的类型。谢谢杰森:)
var lstSynonym = TechContext.TermSynonyms
.Where(p => p.Name.StartsWith(startLetter))
.AsEnumerable()
.Select(u => new SearchTerm
{
ContentId = u.ContentId,
Title = u.Name,
Url = u.Url
});