簡體   English   中英

LINQ 表達式 'FirstOrDefault()' 無法翻譯,將在本地求值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM