我有一个场景,如果给出日期,我需要过滤查询。
我创建了一个过滤器扩展程序。
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>'
我错过了什么?或者应该怎么做来实现过滤器?任何帮助将非常感激。谢谢!
答案 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
});