是否可以在EntityFramework中对SelectMany使用Select(l => new {})

时间:2009-08-27 01:05:35

标签: c# entity-framework lambda

我正在尝试一些我不确定的事情,但我想在这里询问是否有可能。

能够完成吗?

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中构建   查询。

这是否意味着“不可能”?

谢谢

3 个答案:

答案 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
                                 });