![](/img/trans.png)
[英]Entity Framework Core 6.0.8 WHERE clause for dynamic query issues
[英]MySQL - Where Issues with Entity Framework
該查詢有效。
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
型號具有Status
和Title
屬性。
錯誤: Object reference not set to an instance of an object.
MySql.Data
版本:6.9.9
Connector/Net
:6.9.9
MySql.Data.Entity.EF6
只需添加orderby並得到錯誤。 你能告訴我為什么嗎?
堆棧跟蹤:
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)
根據堆棧跟蹤,這是處理? :
? :
運算符部分( CaseFragment
)。
這就導致我們通過消除來解決問題? :
? :
構造
(value == null ? true : d.Status == 1)
相當於
(value == null || d.Status == 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>
/ O或將IQueryable< T>
/ O轉換為列表,數組等之后, 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.