无法将LINQ查询结果转换为ToList

时间:2014-04-16 07:20:25

标签: c# linq entity-framework

  /// <summary>
        /// Get All Countries 
        /// </summary>
        /// <returns></returns>
        public IEnumerable<CountryVM> GetAllCountry( )
        {
            using (Context context  = new Context() )
            {
                var countries = context.COUNTRY.Select(c => new CountryVM()
                     {
                         ID = c.ID,
                         DESCRIPTION = c.DESCRIPTION,
                     }

                ).ToList(); // Gets Exception here.
                return countries;
            }

为什么我无法转换为ToList()?

Iget遵循例外:

  

LINQ to Entities无法识别该方法   'System.Collections.Generic.List 1[LANGUAGE] ToList[LANGUAGE](System.Collections.Generic.IEnumerable 1 [LANGUAGE])'   方法,并且此方法无法转换为商店表达式。

4 个答案:

答案 0 :(得分:2)

一个常见的错误,因为您可能会多次遇到它,请让我解释一下为什么会发生这种情况。

让我们阅读错误信息:

  

LINQ to Entities无法识别方法

Linq to entities,将linq表达式转换为SQL的库(假设您使用的是SQLServer数据库),并不了解您要求它执行的操作。它没有得到什么?

  

“System.Collections.Generic.List1 [LANGUAGE]   ToList [LANGUAGE](System.Collections.Generic.IEnumerable1 [LANGUAGE])'方法

由于命名空间和返回类型我们不习惯这样看,这是一个漫长而混乱的签名,但它是你要求Linq2Entities翻译的方法:ToList&lt; LANGUAGE&gt;(IEnumerable&lt; LANGUAGE&gt;)返回一个List&lt; LANGUAGE&gt;。您可能在EntityCollection<LANGUAGE>某处调用了扩展方法.ToList()。

  

并且此方法无法转换为商店表达式。

在那里,它说,它无法将你的Linq表达式转换为商店(读取:SQL)表达式。

为什么Linq2Entities会尝试将您的EntityCollection<LANGUAGE>.ToList()翻译为SQL?因为lambda表达式中的所有内容(x => do some stuff部分)都将被转换为SQL。由于在显示的代码中没有提到EntityCollection&lt; LANGUAGE&gt;,我必须猜测它在CountryVM的构造函数中。

这就是为什么Zunair Zubair的答案有效:你的.Select(),因此你的lambda表达式不是由Linq2Entities翻译的,因为你在一个对象上调用它,所以没有涉及SQL,因此没有翻译问题

<强>解

很难提出任何建议,因为我不知道你想在构造函数中实现什么,但可能的解决方案是:

using (Context context = new Context() )
{
    List<LANGUAGE> langs = context.LANGUAGE.ToList();
    return context.COUNTRY.Select(c => new CountryVM(langs)
    {
        ID = c.ID,
        DESCRIPTION = c.DESCRIPTION,
    }).ToList();
}

并从第二个构造函数中删除假设的context.LANGUAGE.ToList();。这涉及对数据库的两个请求,可以进一步优化,但不能不知道您的意图和表外键。

答案 1 :(得分:0)

我怀疑表达式

context.COUNTRY.Select(c => new CountryVM() { ID = c.ID, DESCRIPTION = c.DESCRIPTION, })

返回单个实体而不是枚举,这就是无法将其转换为列表的原因。

答案 2 :(得分:-1)

您可以尝试以下

var countries = context.COUNTRY.ToList().Select(c => new CountryVM()
                 {
                     ...
                 }

            ).ToList();
            return countries;

答案 3 :(得分:-1)

假设您的c.ID和c.DESCRIPTION是标量属性,

不应该这样做。

var countries = (from c in context.COUNTRY
                 select new CountryVM()
                 {
                     ID = c.ID,
                     DESCRIPTION = c.DESCRIPTION,
                 }).ToList();