我的项目正在使用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();
}
答案 0 :(得分:1)
好吧,我已经将代码调整了足够长的时间,以至于我偶然发现了一个有效的变体:
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时,它是否有效,我不知道。
感谢所有的建议和帮助。
答案 1 :(得分:-1)
问题是您的查询正在调用LINQ无法转换为SQL的代码。
首先尝试这个,它可能有所帮助。您的(decimal)
演员表可能存在问题。将方法GetModelDifficulty
修改为以下内容:
public decimal GetModelDifficulty(string model)
{
return Convert.ToDecimal(db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.Difficulty).FirstOrDefault());
}
如果这不起作用,我担心你不得不进一步打破你的询问以缩小问题范围。使用此处提供的文档:Standard Query Operator Translation (LINQ to SQL)以确保您使用的任何扩展方法都支持翻译。
如果遇到一段无法翻译的代码,您可能需要声明一个单独的变量,其中已存储了必要的值,然后您可以在查询中使用。
答案 2 :(得分:-2)
我认为这是因为您对FirstOrDefault()的调用可以返回null值。当您分配给键入的对象时,您可以使用?运算符表示它可以为null:
decimal? myDec = <some code returning decimal value or null>
然后你可以通过以下方式检查myDec是否为null:
myDec.HasValue