我正在开发MVC4和Entity Framework 5中的应用程序,最近在执行查询时遇到了这个异常。
{“LINQ to Entities无法识别方法'System.String PadLeft(Int32,Char)'方法,并且此方法无法转换为商店表达式。”}
当我在过去遇到过类似的错误时,我只是在查询之外创建了一个变量,然后在LINQ语句中使用了该变量。不幸的是,在这种情况下,我正在操纵行结果,所以我不确定如何去做或如果这是最好的方法。任何帮助,将不胜感激。我的查询如下:
IQueryable<System.String> LEAPrograms = db.Datamart_Draft
.Where(where => where.snapshot_id == snapshot_id
&& !String.IsNullOrEmpty(where.entity_program))
.Select(sel => (sel.entity_program.PadLeft(PROGRAMLENGTH, '0'))).Distinct();
答案 0 :(得分:12)
这不是太优雅,但它确实起作用:
...
.Select(sel => SqlFunctions.Replicate
("0", PROGRAMLENGTH - sel.entity_program.Length)
+ sel.entity_program)
答案 1 :(得分:-2)
我觉得Gert Arnold的优雅解决方案。基于他的回答,这是一个真正的解决方案:
List<string> samplesWithoutMeasures = new List<string>();
samplesWithoutMeasures = (from mm in DB.MEDICIONESMUESTRA
join mu in DB.MUESTRAS on mm.IDMUESTRA equals mu.IDMUESTRA
where (mu.IDESTADOMUESTRA >= 7 && mu.IDESTADOMUESTRA <= 8) && (mu.ESDUPLICADODE == null) &&
(mm.IDESTADOMEDICIONMUESTRA == 1 && mm.IDPARAMETRO == Parameter.IDPARAMETRO) &&
(mu.FECHARADICACION >= StartDate && mu.FECHARADICACION <= EndDate)
select SqlFunctions.Replicate("0", 15 - (SqlFunctions.StringConvert((double)mm.IDMUESTRA).Trim()).Length)
+ SqlFunctions.StringConvert((double)mm.IDMUESTRA).Trim()
).ToList();
答案 2 :(得分:-4)
我最终创建了一个List然后迭代结果。当我在List上执行.Distinct()时,它会将其强制转换为IEnumerable。我不确定性能方面哪个更好,但是通过一些努力,我认为PadLeft可以为LINQ to Entities创建,它们大致相同。
IEnumerable<String> LEAPrograms = db.Datamart_Draft.Where(wh => wh.snapshot_id == snapshot_id && !String.IsNullOrEmpty(wh.entity_program)).Select(se => se.entity_program).Distinct();
// create and populate a List (because LINQ to Entities doesn't support PadLeft)
List<String> PaddedPrograms = new List<String>();
foreach (var row in LEAPrograms)
{
PaddedPrograms.Add(row.PadLeft(4, '0'));
}
LEAPrograms = PaddedPrograms.Distinct();