2013-12-17 129 views
0

我正在使用Kendo UI MVC包裝創建網格。問題與LINQ查詢

在控制器中的代碼如下:

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 was unhandled by user code
Message=Unable to cast object of type 'System.Data.Objects.ObjectQuery 1[System.String]' to type 'System.Linq.IQueryable 1[WaldenCompleteFaxWeb.Models.FaxesSendServer]'. Source=WaldenCompleteFaxWeb StackTrace: at WaldenCompleteFaxWeb.Controllers.HomeController.GetFaxHistory(DataSourceRequest request) in C:\waldenltd\Customer Applications\WaldenCompleteFaxWeb\WaldenCompleteFaxWeb\Controllers\HomeController.cs:line 48 at lambda_method(Closure , ControllerBase , Object[]) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c_DisplayClass42.b_41() at System.Web.Mvc.Async.AsyncResultWrapper.<>c_DisplayClass8 1.<BeginSynchronous>b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.End() at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c_DisplayClass37.<>c_DisplayClass39.b_33() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c_DisplayClass4f.b_49() InnerException:

我在做什麼錯?

+0

您的代碼是否可以編譯?兩個查詢結果都使用相同的變量名稱? –

+0

是的。代碼在這兩個例子中編譯。第一個代碼示例(不使用select)不會出錯。選擇示例代碼出錯。爲什麼選擇所有的字段按預期工作,當我做選擇我得到上面的錯誤? – user1181226

+0

那麼至少即時得到一個錯誤說:「一個名爲'faxHistoryJson'的本地變量已經在這個範圍內聲明。」 –

回答

0

看起來好像c.Status正在返回除FaxesSendServer以外的東西。

如果它返回一個string,你需要改變它的東西是這樣的:

IQueryable faxHistoryJson = 
    (IQueryable<string>)faxHistory.FaxesSendServers.Select(c => c.Status); 
// note the change^
+0

謝謝您花時間嘗試回答此問題。這個問題構建得不好,並沒有解釋我真正的問題。你的回答讓我走上正確的軌道,得到我正在尋找的答案 – user1181226

0

faxHistoryJson將是一組不是FaxesSendServer的字符串,因爲您正在選擇狀態。

+0

因此,轉換爲IQueryable 無效 –

0

Select語句改變所產生的輸出類型。

第一條語句只是對集合進行過濾並仍然檢索FaxesSendServer,但是您的語句會獲得列Status(即int或string也許)的類型。

0

LINQ按照延期執行。這意味着執行只會在您嘗試訪問結果時觸發。這就是爲什麼你沒有得到任何例外的原因。此外,您可能需要將您的源代碼轉換爲IQueryable或在投影中使用AsQuerable()擴展方法。

0

這個問題的問題是它的構造不好。我給出的代碼樣本沒有充分描述我遇到的問題。

公共的ActionResult GetFaxHistory([DataSourceRequest] DataSourceRequest請求) { 使用(VAR faxHistory =新waldenEntities()){ IQueryable的 faxHistoryJson
=(System.Linq.IQueryable)faxHistory.FaxesSendServers.Where(p值= > 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網格中