无法隐式转换IQueryable

时间:2015-04-05 16:27:52

标签: c# asp.net-mvc linq asp.net-mvc-4

我有一个场景,如果给出日期,我需要过滤查询。

我创建了一个过滤器扩展程序。

public static IQueryable<T> Between(this IQueryable<T> qry,
                                       DateTime start,
                                        DateTime end) 
{
  return from i in qry
         where i.Date >= start &&
               i.Date <= end
         select i;
}

在我的控制器中。

public ActionResult Detail(DateTime? start, DateTime? end)
{
  var foo = _db.Foo
             .Include("Bars")
             .Include("FoxItem.Fox")
             .Where(f => f.IsGood);

  if (start != null && end != null) {
    foo = foo
           .Between(start, end)
           .Select(f => new FooVm {
             FooId = f.Id,
             FooName = f.Name
           });
    return PartialView(foo);
  }

  foo = foo
        .Select(f => new FooVm {
             FooId = f.Id,
             FooName = f.Name
         });

  return View (foo);
}

我收到了这个错误,它说:

Cannot implicitly convert type 'System.Linq.IQueryable<FooVm> to System.Linq.IQueryable<Foo>'

我错过了什么?或者应该怎么做来实现过滤器?任何帮助将非常感激。谢谢!

2 个答案:

答案 0 :(得分:1)

选择FooVM结果时,只需尝试使用另一个变量而不是foo

foo2 = foo
    .Select(f => new FooVm {
         FooId = f.Id,
         FooName = f.Name
     });

return View (foo2);

在第一行中,您“隐式”使用“var”声明foo为IQueriable<Foo>,然后最后您尝试将其分配给IQueriable<FooVM>

答案 1 :(得分:1)

因为var foo属于IQueryable<Foo>类型。当您应用Between并选择新的FooVm时,您无法将此隐式转换为Foo。 Select的返回类型将导致IQueryable<FooVm>因此您需要使用新变量。对于e.q。

IQueryable<FooVm> result = foo
       .Between(start, end)
       .Select(f => new FooVm {
         FooId = f.Id,
         FooName = f.Name
       });