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

时间:2014-05-13 07:33:27

标签: c# linq entity-framework resharper

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<Object>”的对象的非通用DbSet创建FooEntity

     

源=的EntityFramework

     

StackTrace :(为简洁起见)

ReSharper的建议有什么问题?

1 个答案:

答案 0 :(得分:2)

其实我得到了另一个错误:     System.InvalidCastException:无法为非通用DbSet<Object>为类型的对象创建DbSet

这里的问题是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(),
                    });