LINQ查询问题

时间:2013-12-17 13:00:22

标签: c# linq kendo-grid

我使用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.ObjectQuery 1[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,IDictionary 2 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_ DisplayClass8 1.<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:

我做错了什么?

5 个答案:

答案 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网格中