Asp.net mvc 4 对于EF5.x中缺少对PadLeft的支持,有什么解决方法吗?

Asp.net mvc 4 对于EF5.x中缺少对PadLeft的支持,有什么解决方法吗?,asp.net-mvc-4,entity-framework-5,Asp.net Mvc 4,Entity Framework 5,我正在MVC4和Entity Framework 5中开发一个应用程序,最近在执行查询时遇到了这个异常 {“LINQ to Entities无法识别方法'System.String PadLeft(Int32,Char)'方法,并且无法将此方法转换为存储表达式。”} 当我在过去遇到类似的错误时,我只是在查询之外创建了一个变量,然后在LINQ语句中使用了该变量。不幸的是,在本例中,我正在处理行结果,因此我不确定如何进行,或者这是否是最好的方法。任何帮助都将不胜感激。我的问题如下:

我正在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();
IQueryable LEAPrograms=db.Datamart\u草稿
.Where(Where=>Where.snapshot\u id==snapshot\u id
&&!String.IsNullOrEmpty(其中.entity_程序))
.Select(sel=>(sel.entity_program.PadLeft(PROGRAMLENGTH,'0')).Distinct();

它不太雅致,但它确实起到了作用:

...
.Select(sel => SqlFunctions.Replicate
                   ("0", PROGRAMLENGTH - sel.entity_program.Length)
             + sel.entity_program)

我最终创建了一个列表,然后遍历结果。当我在列表上执行.Distinct()时,它会将其转换回IEnumerable。我不确定性能方面哪一个更好,但经过一些努力,我认为可以为linqto实体创建一个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();
IEnumerable LEAPrograms=db.Datamart\u Draft.Where(wh=>wh.snapshot\u id==snapshot\u id&&!String.IsNullOrEmpty(wh.entity\u program)).Select(se=>se.entity\u program.Distinct();
//创建并填充列表(因为LINQ to Entities不支持PadLeft)
List PaddedPrograms=新列表();
foreach(LEAPrograms中的var行)
{
PaddedPrograms.Add(row.PadLeft(4,'0'));
}
LEAPrograms=PaddedPrograms.Distinct();

我认为格特·阿诺德的解决方案很优雅。根据他的回答,这里有一个真正的解决方案:

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();
List sampleswithout measures=new List();
不带测量值的样本=(从mm到DB.MEDICIONESMUESTRA)
在mm.IDMUESTRA上的DB.muestra中加入mu等于mu.IDMUESTRA

哪里(mu.IDESTADOMUESTRA>=7&&mu.IDESTADOMUESTRA=StartDate&&mu.FECHARADICACION您能在表上创建一个额外的计算列,用适当数量的0填充
实体程序吗?这是可能的,但我更喜欢可重用的。我不想为我创建的每个列创建一个额外的列如果我可以避免的话,我会把它改成pad。对不起,这是胡说八道。对你来说,这可能是一个“真正的”解决方案,对其他人(包括OP)来说,这是毫无意义的。它与OP的数据无关。