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();
4

3 回答 3

12

它不是太优雅,但它可以完成工作:

...
.Select(sel => SqlFunctions.Replicate
                   ("0", PROGRAMLENGTH - sel.entity_program.Length)
             + sel.entity_program)
于 2013-02-28T15:37:31.057 回答
-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();
于 2014-07-31T14:41:07.013 回答
-4

我最终创建了一个列表,然后遍历结果。当我在列表上执行 .Distinct() 时,它会将其转换回 IEnumerable。我不确定性能方面哪个更好,但通过一些努力,我认为可以为 LINQ to Entities 创建一个 PadLeft,它做的事情大致相同。

            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();
于 2013-02-28T18:10:14.767 回答