[英]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.