2012-07-13 144 views
0

我想過濾Linq查詢後的結果。Linq,EF4,Linq查詢後過濾數據

並將其設置爲List()或Array()。

這是我的代碼,

//for test, filter is always true 
bool filter = true; 

OrdersRepository ordersRepository = new OrdersRepository(); 

var productInQuery = ordersRepository.ProductIn; 
var productOutQuery = ordersRepository.ProductOut; 
var productQuery = ordersRepository.Product; 
var orderInfoQuery = ordersRepository.OrderInfo; 

var result = (from p in productInQuery 
     join o in orderInfoQuery on p.refNo equals o.refNo 
     join x in productQuery on p.productNo equals x.no 
     join t in productOutQuery on p.no equals t.productInNo into productIn 
     from t in productIn.DefaultIfEmpty() 
     orderby o.processDate descending 
     select new reportModel 
     { 
      yourRef = o.yourRefNo, 
      modelNo = x.modelNo, 
      mfgNo = p.mfgNo, 
      serialNo = p.serialNo, 
      poNo = p.poNo, 
      lbs = p.lbs, 
      width = p.width, 
      height = p.height, 
      depth = p.depth, 
      qty = p.qty, 
      dateIn = o.processDate, 
      dateOut = (from m in orderInfoQuery where m.refNo == t.refNo select m.processDate).FirstOrDefault(), 
      etaDate = (from w in orderInfoQuery where w.refNo == t.refNo select w.eta).FirstOrDefault() 
     }); 

// Filter one more time 
if (filter) 
{ 
    List<reportModel> a = (from q in result 
     where q.etaDate >= new DateTime(2012, 5, 20) 
     select q).ToList(); 

    //var a = result.Where(q => q.etaDate >= new DateTime(2012, 5, 20)).ToList(); //I tried this too, but it does not work either. 
} 
else 
{ 
    var a = result.ToList(); 
} 

當運行上面的代碼,錯誤消息發生。

Specified method is not supported. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NotSupportedException: Specified method is not supported. 

Source Error: 


Line 64:     */ 
Line 65: 
Line 66:     var a = result.Where(q => q.etaDate >= new DateTime(2012, 5, 20)).ToList(); 
Line 67:    } 
Line 68:    else 

Source File: WebUI\Controllers\TestController.cs Line: 66 

Stack Trace: 


[NotSupportedException: Specified method is not supported.] 
    MySql.Data.Entity.SqlGenerator.Visit(DbApplyExpression expression) +28 
    System.Data.Common.CommandTrees.DbApplyExpression.Accept(DbExpressionVisitor`1 visitor) +23 
    MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type) +35 
    MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type) +21 
    MySql.Data.Entity.SelectGenerator.Visit(DbProjectExpression expression) +38 
    System.Data.Common.CommandTrees.DbProjectExpression.Accept(DbExpressionVisitor`1 visitor) +23 
    MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type) +35 
    MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type) +21 
    MySql.Data.Entity.SelectGenerator.Visit(DbFilterExpression expression) +37 
    System.Data.Common.CommandTrees.DbFilterExpression.Accept(DbExpressionVisitor`1 visitor) +23 
    MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type) +35 
    MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type) +21 
    MySql.Data.Entity.SelectGenerator.Visit(DbProjectExpression expression) +38 
    System.Data.Common.CommandTrees.DbProjectExpression.Accept(DbExpressionVisitor`1 visitor) +23 
    MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type) +35 
    MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type) +21 
    MySql.Data.Entity.SelectGenerator.Visit(DbProjectExpression expression) +38 
    System.Data.Common.CommandTrees.DbProjectExpression.Accept(DbExpressionVisitor`1 visitor) +23 
    MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type) +35 
    MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type) +21 
    MySql.Data.Entity.SelectGenerator.Visit(DbSortExpression expression) +63 
    System.Data.Common.CommandTrees.DbSortExpression.Accept(DbExpressionVisitor`1 visitor) +23 
    MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type) +35 
    MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type) +21 
    MySql.Data.Entity.SelectGenerator.Visit(DbProjectExpression expression) +38 
    System.Data.Common.CommandTrees.DbProjectExpression.Accept(DbExpressionVisitor`1 visitor) +23 
    MySql.Data.Entity.SelectGenerator.GenerateSQL(DbCommandTree tree) +60 
    MySql.Data.MySqlClient.MySqlProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree) +334 
    System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree) +147 
    System.Data.EntityClient.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree) +526 

[EntityCommandCompilationException: An error occurred while preparing the command definition. See the inner exception for details.] 
    System.Data.EntityClient.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree) +1329 
    System.Data.EntityClient.EntityProviderServices.CreateCommandDefinition(DbProviderFactory storeProviderFactory, DbCommandTree commandTree) +97 
    System.Data.EntityClient.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree) +198 
    System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree) +147 
    System.Data.Objects.Internal.ObjectQueryExecutionPlan.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Span span, ReadOnlyCollection`1 compiledQueryParameters) +397 
    System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) +696 
    System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +149 
    System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +44 
    System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator() +40 
    System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() +40 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +315 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +58 
    BseWms.WebUI.Controllers.TestController.dateTest() in C:\Users\mark\Documents\Visual Studio 2010\Projects\BseWms\BseWms.WebUI\Controllers\TestController.cs:66 
    lambda_method(Closure , ControllerBase , Object[]) +62 
    System.Web.Mvc.<>c__DisplayClass1.<WrapVoidAction>b__0(ControllerBase controller, Object[] parameters) +17 
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 
    System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263 
    System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343 
    System.Web.Mvc.Controller.ExecuteCore() +116 
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97 
    System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10 
    System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21 
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 
    System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50 
    System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8970349 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 

和reportModel類。

public class reportModel 
{ 
    public string yourRef {get; set;} 
    public string modelNo {get; set;} 
    public string mfgNo {get; set;} 
    public string serialNo {get; set;} 
    public string poNo {get; set;} 
    public Nullable<float> lbs { get; set; } 
    public Nullable<float> width { get; set; } 
    public Nullable<float> height { get; set; } 
    public Nullable<float> depth { get; set; } 
    public int qty {get; set;} 
    public Nullable<DateTime> dateIn { get; set; } 
    public Nullable<DateTime> dateOut { get; set; } 
    public Nullable<DateTime> etaDate { get; set; } 
} 

這段代碼有什麼問題? @ @。

有人知道,請請指教我。

感謝

[編輯]

@Tyrsius

我想爲你的意見,但同樣的錯誤發生。

var thedate = new DateTime(2012, 5, 20); 
List<reportModel> a = (from q in result 
         where q.etaDate >= thedate 
         select q).ToList(); 

enter image description here

+0

是否存在可能給我們提供線索的InnerException中的特定對象? – lopezbertoni 2012-07-14 00:29:30

回答

1

這裏

List<reportModel> a = (from q in result 
    where q.etaDate >= new DateTime(2012, 5, 20) select q).ToList(); 

,該位是非法的,因爲EF需要轉化爲SQL這一點,你不能在對象的構造函數傳似new Datetime()。解決方法很簡單:想查詢

var date = new DateTime(2012, 5, 20); 
List<reportModel> a = (from q in result 
    where q.etaDate >= date select q).ToList(); 
+0

我嘗試了你的建議,但仍然有同樣的錯誤。我將結果視圖添加到我的問題中,請您再次查看我的問題嗎? – 2012-07-13 03:47:09

+0

@Expertwannabe嗯。最初的調用結果是延遲的,所以它可能會觸發'DefaultIfEmpty',我相信這不被EF支持。我猜你看到有人試圖做一個外部連接?如果是這樣,看到這個問題:http://stackoverflow.com/questions/1770586/is-an-outer-join-possible-with-linq-to-entity-framework – Tyrsius 2012-07-13 06:07:13

0

假設結果使用它之前構造對象執行罰你可以過濾你的查詢是這樣的:

if(filter) 
{ 
    var dateFilter = new DateTime(2012, 5, 20); 
    result = result.Where(x => x.etaDate >= dateFilter); 
} 

return result.ToList(); //or .ToArray() 

我建議你把後一個斷點結果會執行並查看您是否擁有正確的reportModel。 結果是作爲一個IQueryable被鑄造,是否有一個特定的原因,你爲什麼要把它轉換爲一個List?

希望這會有所幫助。