/// <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])' 方法,并且此方法无法转换为商店表达式。
答案 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)
不应该这样做。
var countries = (from c in context.COUNTRY
select new CountryVM()
{
ID = c.ID,
DESCRIPTION = c.DESCRIPTION,
}).ToList();