如何遍歷下面的專案并使用值 (!) 錯誤更新具有空值的欄位:
無法將 System.threading.task 型別隱式轉換為 System.Collections.Generic.IEnumerable<Respositories.AssignmentMasterData>
using (SUPEntities db = new SUPEntities())
{
IEnumerable<AssignementMasterData> masterDatas = null;
masterDatas = db.AssignementMasterDatas
.Where(m => DbFunctions.TruncateTime(m.CreatedDateTime) >= DbFunctions.TruncateTime(criteria.FilterStartDate)
&& DbFunctions.TruncateTime(m.CreatedDateTime) <= DbFunctions.TruncateTime(criteria.FilterEndDate)
&& (m.AssignmentNoteNumber == criteria.AssigmentNumber || criteria.AssignmentNumber == null)
&& (m.BaseCourseId == criteria.courseId || criteria.CourseId == 0)
&& (m.AccountNumber == criteria.AccountNumber || criteria.AccountNumber == null)
&& (m.ReferenceNumber == criteria.ReferenceNumber || criteria.ReferenceNumber == null)
&& (m.FacultyCode == criteria.FAcultyCode || criteria.FacultyCode == null)
&& (m.Processed == criteria.Processed)
&& (m.ClassNumber == criteria.ClassNumber || criteria.ClassNumber == null))
.ForEachAsync(t => t.AssignmentNoteIdentifiedClasses.Select(e => String.IsNullOrEmpty(e.Category)? "(!)": e.Category));
}
uj5u.com熱心網友回復:
- 用于
.Include( m => m.AssignmentNoteIdentifiedClasses )在單個查詢中引入相關資料,這比在 for-each-row 回圈中加載每組相關資料要快得多AssignmentNoteIdentifiedClasses。- 這也稱為 ORM 中的“N 1 問題”。
- 您不需要使用
TruncateTime.- 事實上,您不應該這樣做,因為這意味著您的查詢不是 SARGable。
- 避免在 SQL 謂詞中使用函式。
- 相反,只需四舍五入
criteria.FilterStartDate到應用程式代碼中的開始日期,并將其與m => m.CreatedDateTime >= filterStart. - 同樣,
FilterEndDate應該四舍五入,然后像這樣比較:m => m.CreatedDateTime < filterEnd- 始終使用獨占上限。它使一切,尤其是日期范圍謂詞,更容易處理。
- 你不需要
&&在你的Where. 請改用其他單獨的.Where()子句。它們將WHERE作為單獨的AND術語添加到相同的(單個)子句中。 - 我認為EF Core是不復雜的,足以認定“
NULL-means-忽略”反模式可選搜索謂詞,在這種情況下不使用“NULL-means-忽略”反模式在IQUERYABLE<T>謂詞!- 這很糟糕,原因有很多:即因為查詢執行計劃基于SQL 查詢的結構(“形狀”)而不是引數值,因此
NULL當某些情況下將使用相同的非引數快取執行計劃,甚至所有引數都NULL- 這是一個問題。另外,請務必閱讀引數嗅探。 - 而是通過使用的 Linq 擴展并重新分配給自身來構建您的查詢
IQueryable<T>。- 例如
IQueryable<T> query = db.Etc; query = query.Where( e => etc ); - 每個
.Where()都作為AND條件添加。如果要建立OR條件,請使用PredicateBuilder.
- 例如
- 這很糟糕,原因有很多:即因為查詢執行計劃基于SQL 查詢的結構(“形狀”)而不是引數值,因此
DateTime filterStart = criteria.FilterStartDate.Date;
DateTime filterEndExcl = criteria.FilterEndDate .Date.AddDays(1);
using (SUPEntities db = new SUPEntities())
{
IQueryable<AssignementMasterData> query = db.AssignementMasterDatas
.Include( m => m.AssignmentNoteIdentifiedClasses )
.Where( m => m.CreatedDateTime >= filterStart )
.Where( m => m.CreatedDateTime < filterEndExcl ) // Exclusive upper-bound.
.Where( m => m.Processed == criteria.Processed )
.Where( m => m.ClassNumber == criteria.ClassNumber )
;
if( criteria.AssigmentNumber != null )
{
query = query.Where( m => m.AssignmentNoteNumber == criteria.AssigmentNumber );
}
if( criteria.AccountNumber != null )
{
query = query.Where( m => m.AccountNumber == criteria.AccountNumber );
}
if( criteria.CourseId != null && criteria.CourseId.Value > 0 )
{
query = query.Where( m => m.BaseCourseId == criteria.CourseId );
}
if( criteria.ReferenceNumber != null )
{
query = query.Where( m => m.ReferenceNumber == criteria.ReferenceNumber );
}
if( criteria.FacultyCode != null )
{
query = query.Where( m => m.FacultyCode == criteria.FacultyCode );
}
if( criteria.ClassNumber != null )
{
query = query.Where( m => m.ClassNumber == criteria.ClassNumber );
}
List<AssignementMasterData> rows = await query.ToListAsync().ConfigureAwait(false);
List<String> categories = rows
.SelectMany( r => r.AssignmentNoteIdentifiedClasses )
.Select( String.IsNullOrEmpty(e.Category)? "(!)": e.Category) )
.ToList();
return categories;
}
上面可以通過添加一個新的擴展方法來簡化(確保你使用Expression<Func<...>>而不僅僅是Func<>這樣 EF 仍然可以解釋查詢:
public static class MyQueryableExtensions
{
public static IQueryable<T> WhereIfNotNull<T,TValue>( this IQueryable<T> query, TValue? value, Expression<Func<T,Boolean>> predicate )
where TValue : struct
{
if( value.HasValue && value.Value != default(TValue) )
{
return query.Where( predicate );
}
else
{
return query;
}
}
}
像這樣使用:
// `criteria` is now named `c` for brevity.
DateTime filterStart = c.FilterStartDate.Date;
DateTime filterEndExcl = c.FilterEndDate .Date.AddDays(1);
using (SUPEntities db = new SUPEntities())
{
IQueryable<AssignementMasterData> query = db.AssignementMasterDatas
.Include( m => m.AssignmentNoteIdentifiedClasses )
.Where( m => m.CreatedDateTime >= filterStart )
.Where( m => m.CreatedDateTime < filterEndExcl ) // Exclusive upper-bound.
.Where( m => m.Processed == c.Processed )
.Where( m => m.ClassNumber == c.ClassNumber )
.WhereIfNotNull( c.AssigmentNumber, m => m.AssignmentNoteNumber == c.AssigmentNumber )
.WhereIfNotNull( c.AccountNumber , m => m.AccountNumber == c.AccountNumber )
.WhereIfNotNull( c.CourseId , m => m.BaseCourseId ? == c.CourseId )
?.WhereIfNotNull( c.ReferenceNumber, m => m.ReferenceNumberr == c.ReferenceNumber )
?.WhereIfNotNull( c.FacultyCode , m => m.FacultyCoder == c.FacultyCode )
?.WhereIfNotNull( c.ClassNumber , m => m.ClassNumber == c.ClassNumber )
;
List<AssignementMasterData> rows = await query.ToListAsync().ConfigureAwait(false);
List<String> categories = rows
.SelectMany( r => r.AssignmentNoteIdentifiedClasses )
.Select( String.IsNullOrEmpty(e.Category)? "(!)": e.Category) )
.ToList();
return categories;
}
uj5u.com熱心網友回復:
首先,關于錯誤資訊:
您正試圖為masterDatas變數分配錯誤的型別。您將其宣告為 a IEnumerable<Respositories.AssignmentMasterData>,但ForEachAsync最后一行將回傳 a Task,因此會出現錯誤訊息。
見ForEachAsync簽名:
公共靜態 System.Threading.Tasks.Task ForEachAsync(這個 System.Linq.IQueryable 源,Action 動作);
其次。你想回傳一個IEnumerable<Respositories.AssignmentMasterData>
如果你能滿足于同步方法,你可以這樣做:
您需要在某些時候將您IQueryable的IEnumerable. 呼叫就是AsEnumerable()這樣做的。然后你需要替換一些值。因此,您需要使用Select.
using (SUPEntities db = new SUPEntities())
{
var masterDatas = db.AssignementMasterDatas
.Where(m => DbFunctions.TruncateTime(m.CreatedDateTime) >= DbFunctions.TruncateTime(criteria.FilterStartDate)
&& DbFunctions.TruncateTime(m.CreatedDateTime) <= DbFunctions.TruncateTime(criteria.FilterEndDate)
&& (m.AssignmentNoteNumber == criteria.AssigmentNumber || criteria.AssignmentNumber == null)
&& (m.BaseCourseId == criteria.courseId || criteria.CourseId == 0)
&& (m.AccountNumber == criteria.AccountNumber || criteria.AccountNumber == null)
&& (m.ReferenceNumber == criteria.ReferenceNumber || criteria.ReferenceNumber == null)
&& (m.FacultyCode == criteria.FAcultyCode || criteria.FacultyCode == null)
&& (m.Processed == criteria.Processed)
&& (m.ClassNumber == criteria.ClassNumber || criteria.ClassNumber == null))
.AsEnumerable()
.Select(a =>
{
a.AssignmentNoteIdentifiedClasses = a.AssignmentNoteIdentifiedClasses
.Select(e =>
{
e.Category = string.IsNullOrWhiteSpace(e.Category) ? "(!)" : e.Category;
return e;
})
.ToList(); // Depending on the type of AssignmentNoteIdentifiedClasses, ToList() might be replaced.
return a;
});
return masterDatas;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359181.html
上一篇:如何從可列舉轉換為特定模型
