2013-12-17 4 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.StatusFaxesSendServer이 아닌 다른 것을 반환하는 것 같습니다. 그것은 string을 반환하는 경우

, 당신은 이런 식으로 변경해야 할 것 :

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

이 질문에 답변 해 주셔서 감사합니다. 질문은 잘못 작성되어 실제 문제를 설명하지 못했습니다. 당신의 대답은 제가 찾고 있던 대답을 얻는 올바른 길 위에 올려 놓았습니다. – user1181226

0

faxHistoryJson은 상태를 선택하기 때문에 FaxSendServer가 아닌 문자열 세트입니다.

+0

따라서 IQueryable 로의 캐스트는 유효하지 않습니다. –

0

귀하의 Select 문은 결과 출력 형식이 변경됩니다.

첫 번째 문은 모음을 필터링하고 여전히 FaxesSendServer을 검색하지만 명령문에는 Status (int 또는 string 일 수 있음) 열의 유형이 표시됩니다.

0

LINQ 지연 실행을 따르십시오. 즉, 실행 결과는 결과에 액세스하려고 할 때만 트리거됩니다. 이런 이유로 당신은 처음부터 아무런 예외도받지 못합니다. 또한 소스를 IQueryable으로 변환하거나 연장 방법을 AsQuerable() 확장하여 사용해야 할 수도 있습니다.

0

질문의 문제점은 제대로 구성되지 않았기 때문입니다. 내가 준 코드 샘플은 내가 가지고있는 문제를 적절하게 설명하지 못했습니다.

공개 ActionResult GetFaxHistory ([DataSourceRequest] DataSourceRequest 요청) { 사용 (VAR의 새로운 waldenEntities faxHistory =()) { 된 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); 

    } 
} 

상기 코드는 필 수 없으므로 작성하지 못했습니다. 올바른 코드는 다음과 같습니다.

 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 문을 사용하여 날짜 필드의 서식을 지정하여 검도 UI 그리드에 제대로 표시되도록했습니다.