我使用Kendo UI MVC包装器来创建网格。
Controller中的代码如下:
public ActionResult GetFaxHistory([DataSourceRequest] DataSourceRequest request)
{
using (var faxHistory = new waldenEntities())
{
IQueryable<FaxesSendServer> faxHistoryJson
= (System.Linq.IQueryable<WaldenCompleteFaxWeb.Models.FaxesSendServer>)faxHistory.FaxesSendServers.Where(p => p.UserID.Contains("walden"));
return Json(result, JsonRequestBehavior.AllowGet);
}
}
此代码可以正常工作并创建网格。当我尝试选择特定字段时,出现错误:
我正在使用的代码如下:
public ActionResult GetFaxHistory([DataSourceRequest] DataSourceRequest request)
{
using (var faxHistory = new waldenEntities())
{
IQueryable<FaxesSendServer> faxHistoryJson
= (System.Linq.IQueryable<WaldenCompleteFaxWeb.Models.FaxesSendServer>)faxHistory.FaxesSendServers.Where(p => p.UserID.Contains("walden"));
IQueryable faxHistoryJson
= (System.Linq.IQueryable<WaldenCompleteFaxWeb.Models.FaxesSendServer>)faxHistory.FaxesSendServers.Select(c => c.Status);
}
}
我得到的错误在
之下System.InvalidCastException未被用户代码
处理 Message =无法转换类型的对象 'System.Data.Objects.ObjectQuery1[System.String]' to type 'System.Linq.IQueryable
1 [WaldenCompleteFaxWeb.Models.FaxesSendServer]'。 Source = WaldenCompleteFaxWeb StackTrace: 在WaldenCompleteFaxWeb.Controllers.HomeController.GetFaxHistory(DataSourceRequest) 请求)在C:\ waldenltd \ Customer 应用程序\ WaldenCompleteFaxWeb \ WaldenCompleteFaxWeb \ \控制器HomeController.cs:行 48 在lambda_method(Closure,ControllerBase,Object []) 在System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,Object []参数) 在System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 参数) 在System.Web.Mvc.Async.AsyncControllerActionInvoker。&lt;&gt; c_ DisplayClass42.b _41() 在System.Web.Mvc.Async.AsyncResultWrapper。&lt;&gt; c_ DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult
1.End() 在System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult) asyncResult) 在System.Web.Mvc.Async.AsyncControllerActionInvoker。&lt;&gt; c _DisplayClass37。&lt;&gt; c_ DisplayClass39.b _33() 在System.Web.Mvc.Async.AsyncControllerActionInvoker。&lt;&gt; c_ DisplayClass4f.b _49() 的InnerException:
我做错了什么?
答案 0 :(得分:0)
faxHistoryJson将是一组不属于FaxesSendServer的字符串,因为您正在选择状态。
答案 1 :(得分:0)
看起来c.Status
正在返回FaxesSendServer
以外的其他内容。
如果它返回string
,则需要将其更改为以下内容:
IQueryable faxHistoryJson =
(IQueryable<string>)faxHistory.FaxesSendServers.Select(c => c.Status);
// note the change ^
答案 2 :(得分:0)
您的Select
语句会更改生成的输出类型。
第一个语句只过滤集合并仍然检索FaxesSendServer
,但是你的语句会获得列Status
的类型(可能是int或string)。
答案 3 :(得分:0)
LINQ
遵循延期执行。这意味着只有在您尝试访问结果时才会触发执行。这就是为什么你没有得到任何例外的原因。此外,您可能需要将来源转换为IQueryable
或使用AsQuerable()
扩展方法进行投影。
答案 4 :(得分:0)
问题的问题在于它的构造很差。我给出的代码示例没有充分描述我遇到的问题。
public ActionResult GetFaxHistory([DataSourceRequest] DataSourceRequest request)
{
使用(var faxHistory = new waldenEntities())
{
IQueryable faxHistoryJson
=(System.Linq.IQueryable)faxHistory.FaxesSendServers.Where(p =&gt; p.UserID.Contains(“walden”));
IQueryable faxHistoryJson
= (System.Linq.IQueryable<WaldenCompleteFaxWeb.Models.FaxesSendServer>)faxHistory.FaxesSendServers.Select(c => c.Status);
}
}
上面的代码失败了,因为它写成了incorreclty。正确的代码如下:
using (var faxHistory = new waldenEntities())
{
var query = from c in faxHistory.FaxesSendServers.Where(p => p.UserID.Contains("walden"))
select new
{
c.SendID,
c.Status,
c.FaxName,
c.CreateTime,
c.CompletionTime,
c.PageCount,
c.RecipientName,
c.Notes
};
var faxHistoryJson = from c in query.AsEnumerable()
select new
{
c.SendID,
c.Status,
c.FaxName,
CreateTime = c.CreateTime.ToShortDateString() + " " + c.CreateTime.ToShortTimeString(),
c.CompletionTime,
c.PageCount,
c.RecipientName,
c.Notes
};
DataSourceResult result = faxHistoryJson.ToDataSourceResult(request);
return Json(result, JsonRequestBehavior.AllowGet);
}
第一个LINQ语句似乎是创建投影的正确方法的正确方法。第二个LINQ语句用于格式化日期字段,因此它将正确显示在Kendo UI网格中