[英]The LINQ expression 'FirstOrDefault()' could not be translated and will be evaluated locally
在播種中,我使用 jsons 集合來讀取它並插入到數據庫中。
我用這個 function
private void Seed<T, T2>(DbSet<T> dataSet, Func<T, T2> uniquProperty) where T : class, ISeedableEntity<T>
{
var separtor = Path.DirectorySeparatorChar;
var tableName = Model.FindEntityType(typeof(T)).SqlServer().TableName;
var baseDir = Assembly.GetExecutingAssembly().Location;
baseDir = Path.GetDirectoryName(baseDir);
var filePath = $"{baseDir}{separtor}Data{separtor}{tableName}.json";
if (File.Exists(filePath))
{
var data = File.ReadAllText(filePath);
var items = JsonConvert.DeserializeObject<List<T>>(data);
foreach (var item in items)
{
var found = dataSet.Where(
a => uniquProperty(a).Equals(uniquProperty(item))).FirstOrDefault();
if (found != null)
{
found = found.Update(item);
dataSet.Update(found);
}
else
dataSet.Add(item);
}
SaveChanges();
}
}
並將其稱為此代碼。
Seed(CreditRatings, a => a.Id);
問題(我相信)出在uniqueProperty
委托中,它被聲明為Func
委托。 LINQ 無法將編譯后的函數翻譯成 SQL 指令的一部分,因此放棄努力,讓謂詞在調用端解析。
這種不幸的直接結果甚至是,在將他們制服到 function 之前,數據庫中的所有數據將被傳輸給調用者。
您可以嘗試接受評估為bool
的表達式來代替Func
委托。
private void Seed<T, T2>(DbSet<T> dataSet, Expression<Func<T, T, bool>> predicate)
where T : class, ISeedableEntity<T>
{
// ...
}
謂詞必須完成唯一屬性的比較:
Expression<Func<T, T, bool>> seed = (a, b) => a.Id.Equals(b.Id);
也可以合並一個隔離可等式屬性的表達式,然后直接在Where
子句中執行相等性測試,但這需要更多的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.