免责声明:我已经检查了this question,但这是关于立即窗口的。
我正在使用Entity Framework来获取一些结果,所以我有一个日志记录列表:
var result = ctx.Logging.Where(*filtering*).ToList();
但是我想知道列表的不同数据类型(枚举,基础类型字节和Datatype
可以为空,如果我使它不可为空它可以出于某种原因)。当我尝试在即时窗口中执行此操作时:
result.Select(r => r.Datatype).Distinct().ToList();
我收到消息:
表达式评估程序中的内部错误。
然而,当我在代码中执行此操作时,它可以正常工作,例如var test = result.Select(r => r.Datatype).Distinct().ToList();
。我已经尝试使用调试选项中的“托管兼容模式”和“遗留表达式”,但后来又收到了另一条消息:
表达式不能包含lambda表达式
我是否遗漏了某些内容,或者这是Visual Studio 2015中的错误?
Minimal, Complete, and Verifiable example:
class Program
{
static void Main(string[] args)
{
List<Test> tests = new List<Test>();
for(int i = 0; i<100; i++)
{
if (i % 2 == 0)
tests.Add(new Test { ID = i, Enum = TestEnum.Value1 });
else
tests.Add(new Test { ID = i, Enum = TestEnum.Value2 });
}
var distinct = tests.Select(t => t.Enum).Distinct().ToList();
}
}
public enum TestEnum : byte
{
Value1 = 1,
Value2 = 2
}
public class Test
{
public int ID { get; set; }
public TestEnum? Enum { get; set; }
}
在代码tests.Select(t => t.Enum).Distinct().ToList();
中,在即时窗口中不起作用。
答案 0 :(得分:2)
我认为这是表达式评估程序中的一个错误,因为它似乎适用于这样的解决方法:
tests.Select(t => t.Enum).ToList().Distinct().ToList()
使用此结果的结果相同:
? tests.Select(t => t.Enum).ToList().Distinct().ToList()
Count = 2
[0]: Value1
[1]: Value2
我注意到代码中的表达式'quickwatching'也会导致错误:
Internal error in the expression evaluator.
至少在该领域是一致的: - )
答案 1 :(得分:1)
你的表达不起作用:
tests.Select(t => t.Enum).Distinct().ToList();
'Internal error in the expression evaluator.'
但那是因为Enum是一个可以为空的类型。
tests.Select(t => t.Enum.Value).Distinct().ToList();
'Count = 2
[0]: Value1
[1]: Value2'
事实上,EF中使用的本机函数不能在即时窗口中使用lambda表达式。