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


  /// <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无法识别该方法’系统。集合。通用的列出1[LANGUAGE] ToList[LANGUAGE](System.Collections.Generic.IEnumerable 1[语言]('方法,而此方法无法转换为存储表达式。

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

让我们阅读错误消息:

LINQ to Entities不识别方法

Linq-to-entities,将Linq表达式转换为SQL的库(假设你使用的是SQLServer数据库(,不理解你要求它做的事情。它没有得到什么?

’系统。集合。通用的清单1[语言]ToList[LANGUAGE](System.Collections.Generic.IENumberable1[LANGUAGE]('方法

由于命名空间和返回类型的原因,这是一个相当长且混乱的签名,我们不习惯这样看,但这是您要求Linq2Enties翻译的方法:ToList<LANGUAGE>(IEnumerable<LANGUAGE>(,返回一个List<语言>。您可能调用了扩展方法。ToList((在某个EntityCollection<LANGUAGE>上。

并且该方法不能被翻译成存储表达式。

它说,它无法将您的Linq表达式转换为存储(读作:SQL(表达式。

为什么Linq2Entities试图将您的EntityCollection<LANGUAGE>.ToList()转换为SQL?因为lambda表达式(x => do some stuff部分(中的所有内容都将被转换为SQL。由于在所示代码中没有任何地方提到EntityCollection<LANGUAGE>,我不得不猜测它在CountryVM的构造函数中。

这就是Zunair Zubair的答案有效的原因:你的。Select((,因此您的lambda表达式,不会被Linq2Enties翻译,因为您在对象上调用它,因此不涉及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();
}

并从该第二构造函数中移除假设的CCD_ 6。这涉及到对数据库的两个请求,可以进一步优化,但前提是要知道您的意图和表外键。

我怀疑表达式

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

返回的是单个实体,而不是可枚举的,这就是为什么它不能转换为列表的原因。

您可以尝试以下

var countries = context.COUNTRY.ToList().Select(c => new CountryVM()
                 {
                     ...
                 }
            ).ToList();
            return countries;
假设您的c.ID和c.DESCRIPTION是标量属性,则

不应该这样做。。

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

相关内容

  • 没有找到相关文章

最新更新