代码之家  ›  专栏  ›  技术社区  ›  Barbaros Alp

在EntityFramework中,是否可以将Select(l=>New)与SelectMany一起使用?

  •  2
  • Barbaros Alp  · 技术社区  · 15 年前

    我正在尝试一些我不太确定的事情,但我想问一下是否可能。

    能做到吗?

    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实体中构造 查询。

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

    谢谢你

    3 回复  |  直到 12 年前
        1
  •  3
  •   Jason    15 年前

    错误本质上表明实体框架不知道如何创建信息对象,因为它没有绑定到表对象。(换一种方式来说, Select 呼吁 IQueryable 无法转换为等效的SQL。)可以执行 选择 通过以下方式在客户机上投影:

    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);
    }
    
        2
  •  2
  •   Craig Stuntz    15 年前

    可以使用 Select(l => new ...) ,但不具有实体类型。您需要使用匿名类型或带有无参数构造函数的POCO类型。实体类型之所以“特殊”,是因为它们与ObjectContext交互的方式。您可以选择它们,但不能在查询中新建它们。

        3
  •  0
  •   EdChum Arthur G    12 年前

    下面的代码对我有用。这里的“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
                                     });