2013-02-28 38 views
5

我正在處理MVC4和Entity Framework 5中的一個應用程序,最近在執行我的查詢時遇到了這個異常。EF5.x中PadLeft支持不足的解決方法?

{ 「LINQ實體無法識別方法 '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(); 
+1

你能否在表上填充'entity_program'與適當數量的0的附加計算列? – cfeduke 2013-02-28 14:48:44

+0

這是可能的,但我更喜歡可重用的東西。如果我可以避免,我不想爲每個需要填充的列創建附加列。 – Elsimer 2013-02-28 15:13:33

回答

-4

我結束了創建一個列表,然後通過迭代的結果。當我在List上做一個.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(); 
12

這不是太優雅,但它的工作:

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

感謝您的支持! – David 2016-05-05 15:48:33

-2

我認爲格特阿諾德解決方案在優雅。根據他的回答,這是一個真正的解決方案:

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(); 
+1

對不起,這是無稽之談。對你而言,這可能是一個「真正的」解決方案,對於其他人(包括OP)來說,這是毫無意義的。它與OP的數據無關。 – 2016-05-11 12:46:17

相關問題