2017-07-03 72 views
2

此查询是工作。MySQL - 与实体框架有关的问题

string value = null; 
var temp1 = (from d in db.Device 
      where         
       (value == null ? true : d.Status == 1) 
       select d).ToList(); 

但是这个查询不起作用。

string value = null; 
var temp1 = (from d in db.Device 
      where         
       (value == null ? true : d.Status == 1) 
       select d).OrderBy(i => i.Title).ToList(); 

Device模型有StatusTitle性能。

错误:Object reference not set to an instance of an object.

MySql.Data版本:6.9.9

Connector/Net:6.9.9

MySql.Data.Entity.EF6 

只需添加排序依据,并得到了错误。你能告诉我为什么吗?

堆栈跟踪:

at MySql.Data.Entity.CaseFragment.Accept(SqlFragmentVisitor visitor) at MySql.Data.Entity.BinaryFragment.Accept(SqlFragmentVisitor visitor) at MySql.Data.Entity.SqlGenerator.FuseSelectWithInnerSelect(SelectStatement outer, SelectStatement inner) at MySql.Data.Entity.SqlGenerator.TryFusingSelect(InputFragment f) at MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type) at MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type) at MySql.Data.Entity.SelectGenerator.Visit(DbProjectExpression expression) at System.Data.Entity.Core.Common.CommandTrees.DbProjectExpression.Accept[TResultType](DbExpressionVisitor`1 visitor) at MySql.Data.Entity.SelectGenerator.GenerateSQL(DbCommandTree tree) at MySql.Data.MySqlClient.MySqlProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree) at System.Data.Entity.Core.Common.DbProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree, DbInterceptionContext interceptionContext) at System.Data.Entity.Core.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree, DbInterceptionContext interceptionContext) at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree, DbInterceptionContext interceptionContext, IDbDependencyResolver resolver, BridgeDataReaderFactory bridgeDataReaderFactory, ColumnMapFactory columnMapFactory) at System.Data.Entity.Core.EntityClient.Internal.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree, DbInterceptionContext interceptionContext) at System.Data.Entity.Core.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree, DbInterceptionContext interceptionContext) at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.CreateCommandDefinition(ObjectContext context, DbQueryCommandTree tree) at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Boolean streaming, Span span, IEnumerable`1 compiledQueryParameters, AliasGenerator aliasGenerator) at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5() at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation) at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
+0

导致我们一个解决办法听起来像一个错误。异常堆栈跟踪的外观如何? –

+0

是否可以在执行查询后执行排序?那意味着.ToList()。OrderBy()?如果这可行,则可能是查询生成问题。 – DevilSuichiro

+0

你打算使用lambda表达式吗? –

回答

1

它看起来像你正试图重写一个包罗万象的查询作为LINQ。您需要使用LINQ在所有写一个包罗万象的查询,你可以简单地忽略的条件,如果你不想要它,例如:

string value=someOptionalParameter; 
var query = (value==null)? db.Device : db.Where(d=>d.Status == 1);  
var temp1 = query.OrderBy(d=>d.Title).ToList(); 

在这种情况下,value不完全可以使用。它只是用作一面旗帜。如果您没有要使用它,例如,有选择地通过Category场过滤器,你可以以同样的方式使用它在where子句中:

string value=someOptionalParameter; 
var query = (value==null)? db.Device : db.Where(d=>d.Category == value);  
var temp1 = query.OrderBy(d=>d.Title).ToList(); 

在一般情况下,你可以在“建设”的查询位一点点。一个IQueryable< T>直到你试图枚举它和/或它转换成一个列表不被翻译成SQL,数组等等。你可以动态地从用户的选择创建一个这样的查询:

var query = dbContext.MyEntity; 
if (someField != null) 
{ 
    query = query.Where(d=>d.SomeField = someField); 
} 

if (someOtherField != null) 
{ 
    query = query.Where(d=>d.SomeOtherField = someField); 
} 

if (mustOrder != null) 
{ 
    query = query.OrderBy(d=>d.OrderField); 
} 

//Execute the final query 
return query.ToList(); 
+0

这种方法会更好。谢谢。 – Cer

2

根据堆栈跟踪,这是处理? :运算符部分(CaseFragment)时的MySQL连接器错误。

,通过消除了? :结构

(value == null ? true : d.Status == 1) 

具有同等

(value == null || d.Status == 1) 
+0

您可以重写查询并完全消除'value == null',因为它只是一个本地标志。它没有用于查询 –

+0

@PanagiotisKanavos我意识到这一点。我认为这是OP的简化(并不是很好的选择)例子。我也更喜欢有条件的Where方法,但它并不总是适用的,也打破了查询语法的自然流程。在[一点](https://stackoverflow.com/questions/39139402/the-type-appears-in-two-structurally-incompatible-initializations-within-a-singl/39140094#39140094)我试图得到最好的两个通过后处理查询表达式树,但没有时间来敲定想法:) –