【问题标题】:Is it possible to use Select(l=> new{}) with SelectMany in EntityFramework是否可以在 EntityFramework 中使用 Select(l=> new{}) 和 SelectMany
【发布时间】:2009-08-27 01:05:35
【问题描述】:

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

能做到吗?

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

这是“不可能”的意思吗?

谢谢

【问题讨论】:

  • 类“Info”的定义是什么样的?
  • 信息类 | ID、标题、描述、添加日期、观看次数

标签: c# entity-framework lambda


【解决方案1】:

该错误本质上表明实体框架不知道如何创建 Info 对象,因为它未绑定到表对象。 (换句话说,IQueryable 上的 Select 调用无法转换为等效的 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);
}

【讨论】:

  • 谢谢,经过一些实验,我几乎想出了和你一样的代码,现在我看到了你的
  • 这个答案的前两句话的事实完全相反。实体框架可以在可查询的表达式中创建 POCO。将查询翻译成 SQL 也不成问题;这就是它可以投射到 POCO 上的方式。它还可以在从 DB 实现 EntityObject 子类型时创建它们。它不能做的是创建 EntityObject 子类型而不从数据库中实现它们。这样做会使它们在 ObjectContext 中“一半”和“一半”,这很奇怪。
  • Craig:抱歉,当时我在考虑 LINQ-to-SQL。谢谢你的澄清。不过,解决方案仍然有效。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 2012-06-13
      • 2012-11-03
      • 2010-10-03
      相关资源
      最近更新 更多