将foreach循环转换为LINQ查询会中断代码
本文关键字:查询 中断 代码 LINQ foreach 循环 转换 | 更新日期: 2023-09-27 18:03:07
Resharper建议我转换以下代码:
Type myType = typeof(FooEntity);
PropertyInfo nameProp = myType.GetProperty("Name");
PropertyInfo valueProp = myType.GetProperty("Id");
using (var dbContext = new MyEntities())
{
foreach (object obj in dbContext.Set(myType))
{
items.Add(new SelectListItem
{
Text = nameProp.GetValue(obj).ToString(),
Value = valueProp.GetValue(obj).ToString(),
});
}
}
至
Type myType = typeof(FooEntity);
PropertyInfo nameProp = myType.GetProperty("Name");
PropertyInfo valueProp = myType.GetProperty("Id");
using (var dbContext = new MyEntities())
{
items.AddRange(from object obj in dbContext.Set(myType)
select new SelectListItem
{
Text = nameProp.GetValue(obj).ToString(),
Value = valueProp.GetValue(obj).ToString(),
});
}
但在接受了ReSharper的建议后,我得到了一个带有的InvalidCastException
用户代码未处理System.InvalidCastException
消息=无法从非通用
DbSet
为类型为"FooEntity
"的对象创建DbSet<Object>
来源=EntityFramework
StackTrace:(为简洁起见跳过(
ReSharper的建议怎么了?
实际上我又遇到了一个错误:System.InvalidCastException
:无法从类型为的对象的非泛型DbSet
创建DbSet<Object>
。
这里的问题是linq表达式强制DbSet
实现IEnumerable<object>
,这是不可能的,因为它只实现IEnumerable
。为了证明以下代码工作良好
IEnumerable dbSet = dbContext.Set(myType);
items.AddRange(from object obj in dbSet
select new SelectListItem
{
Text = nameProp.GetValue(obj).ToString(),
Value = valueProp.GetValue(obj).ToString(),
});