EF5.x中对PadLeft缺乏支持的任何解决方法?

时间:2013-02-28 14:39:52

标签: asp.net-mvc-4 entity-framework-5

我正在开发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();

3 个答案:

答案 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();