【问题标题】:LINQ to Entities does not recognize the method [duplicate]LINQ to Entities 无法识别该方法 [重复]
【发布时间】:2013-01-16 15:28:12
【问题描述】:

LINQ to Entities 无法识别该方法...

各位,对不起。我意识到这个问题已经被数百人提出。不幸的是,我已经达到了我的心理界限,我找到的答案似乎都与我的情况不相符。

这是我尝试做的:

var apiMenuItems = menuItems.Select(item => new ApiMenuItem()
            {
                ID = item.ID,
                Name = item.Name.GetLocalizedString("en")
            });

如您所见,我想创建几个 ApiMenuItem 类型的新对象(这是一个非常简单的类)。

 public class ApiMenuItem
 {
    public Guid ID { get; set; }
    public string Name { get; set; }
 }

据我了解,Entity Framework 需要将我的 LINQ 语句转换为纯 SQL。这不适用于我的 GetLocalizedString(string languageCode) 扩展方法。

任何人都可以帮助我解决这个问题 - 或解决它的一些代码吗?我自己真的想不出解决方案:-(

非常感谢您的帮助!

【问题讨论】:

  • menuItems是如何初始化的?
  • 在调用Select之前,您是否尝试过使用ToList()的标准解决方案?
  • 能否给出item的类型定义?
  • @DanielHilgarth 您应该使用AsEnumerable 来确保通过 LINQ to Objects 而不是 ToList 评估查询,以免毫无意义地具体化整个列表并将所有项目放入内存中,而不是允许流式传输项目。
  • @DanielHilgarth 因为它返回 IEnumerable 而不是 IQueryable,因此您使用的所有未来 LINQ 方法都将使用 IEnumerable 重载而不是 IQueryable 重载。跨度>

标签: c# linq entity-framework linq-to-entities


【解决方案1】:

如果您在选择 ApiMenuItem 之前使用 ToList() 从数据库中获取项目,则它可以工作:

var apiMenuItems = menuItems.ToList().Select(item => new ApiMenuItem()
{
    ID = item.ID,
    Name = item.Name.GetLocalizedString("en")
});

但出于性能原因,您应该这样做:

var apiMenuItems = menuItems.Select(item => new 
{
    //What to select from db
    ID = item.ID, 
    Name = item.Name
}).ToList() //Fetch from db
.Select(item => new ApiMenuItem()
{
    //Select with code
    ID = item.ID,
    Name = item.Name.GetLocalizedString("en")
});

【讨论】:

  • 嗨弗里克,你是对的。这行得通。但 DanielHilgarth 已经提出了这个建议(请参见上文)。感谢您的帮助!
猜你喜欢
  • 2017-02-03
  • 2021-11-06
相关资源
最近更新 更多