/// <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;
不应该这样做。。
var countries = (from c in context.COUNTRY
select new CountryVM()
{
ID = c.ID,
DESCRIPTION = c.DESCRIPTION,
}).ToList();