将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的建议怎么了?

将foreach循环转换为LINQ查询会中断代码

实际上我又遇到了一个错误: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(),
                    });