簡體   English   中英

方法不支持翻譯成SQL

[英]Method has no supported translation to SQL

我的項目正在使用MVC 4 C#LINQ to SQL。

由於某種原因,用於獲取我的屬性之一的數據的方法給出了“沒有支持的SQL轉換”錯誤。 獲取該數據的方法幾乎與同一查詢中另一屬性的方法相同,除了工作原理是獲取字符串而未獲取小數的字符串。

確切的錯誤代碼:

Method 'System.Decimal GetModelDifficulty(System.String)' has no supported translation to SQL.

我已經嘗試了以下代碼的多種變體,但始終遇到與上面相同的錯誤:

public List<ProductionSchedule> GetBaseProductionSchedule(DateTime selectedDate)
    {
        var spaList = (from x in db.WO010032s
                       join y in db.MOP1042s on x.MANUFACTUREORDER_I equals y.MANUFACTUREORDER_I into x_y
                       where x.STRTDATE == selectedDate && (x.MANUFACTUREORDERST_I == 2 || x.MANUFACTUREORDERST_I == 3)

                       from y in x_y.DefaultIfEmpty()
                       select new ProductionSchedule()
                       {
                           MO = x.MANUFACTUREORDER_I,
                           BOMNAME = x.BOMNAME_I,
                           SpaModel = x.ITEMNMBR,
                           MoldType = GetMoldType(x.ITEMNMBR.Trim()),
                           SerialNumber = y.SERLNMBR,
                           Difficulty = GetModelDifficulty(x.ITEMNMBR.Trim())
                       }).OrderByDescending(x => x.Difficulty).ToList();

        return spaList;
    }

    public string GetMoldType(string model)
    {
        return db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.MoldType).FirstOrDefault();
    }

    public decimal GetModelDifficulty(string model)
    {
        return (decimal)db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.Difficulty).FirstOrDefault();
    }

好吧,我已經將代碼調整了足夠多的時間,直到我偶然發現了一個可行的版本:

public List<ProductionSchedule> GetBaseProductionSchedule(DateTime selectedDate)
    {
        var spaList = (from x in db.WO010032s
                       join y in db.MOP1042s on x.MANUFACTUREORDER_I equals y.MANUFACTUREORDER_I into x_y
                       where x.STRTDATE == selectedDate && (x.MANUFACTUREORDERST_I == 2 || x.MANUFACTUREORDERST_I == 3)

                       from y in x_y.DefaultIfEmpty()
                       select new ProductionSchedule()
                       {
                           MO = x.MANUFACTUREORDER_I,
                           BOMNAME = x.BOMNAME_I,
                           SpaModel = x.ITEMNMBR,
                           MoldType = GetMoldType(x.ITEMNMBR.Trim()),
                           SerialNumber = y.SERLNMBR,
                           Difficulty = GetModelDifficulty(x.ITEMNMBR)
                       }).ToList();

        return spaList.OrderByDescending(x => x.Difficulty).ToList();
    }

    public string GetMoldType(string model)
    {
        return db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.MoldType).FirstOrDefault();
    }

    public decimal GetModelDifficulty(string model)
    {
        decimal difficulty = (String.IsNullOrEmpty(model)) ? 0M : Convert.ToDecimal(db.SkuModelDatas.Where(x => x.Value == model.Trim()).Select(x => x.Difficulty).FirstOrDefault());
        return difficulty;
    }

為什么在一種方法而不是另一種方法中為x.ITEMNMBR(模型參數)捕獲空字符串並且需要在主LINQ查詢之外進行OrderByDescending時為何起作用,我不知道。

感謝您的所有建議和幫助。

問題是您的查詢正在調用LINQ無法轉換為SQL的代碼。

首先嘗試一下,可能會有所幫助。 您的(decimal)可能存在問題。 將您的方法GetModelDifficulty修改為以下內容:

    public decimal GetModelDifficulty(string model)
    {
        return Convert.ToDecimal(db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.Difficulty).FirstOrDefault());
    }

如果這樣不起作用,恐怕您將不得不進一步細分查詢以縮小問題范圍。 使用此處提供的文檔: 標准查詢運算符轉換(LINQ to SQL) ,以確保您使用的任何擴展方法都支持翻譯。

如果遇到一段無法翻譯的代碼,則可能需要聲明一個單獨的變量,該變量中已經存儲了必需的值,然后可以在查詢中使用它。

我認為這是因為您對FirstOrDefault()的調用可以返回空值。 當您分配給鍵入的對象時,可以使用? 運算符,表示它可以為null:

decimal? myDec = <some code returning decimal value or null>

然后,您可以通過以下方式檢查myDec是否為null:

myDec.HasValue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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