2013-02-28 1 views
5

Я работаю над приложением в MVC4 и Entity Framework 5 и недавно столкнулся с этим исключением при выполнении моего запроса.Любое обходное решение из-за отсутствия поддержки PadLeft в EF5.x?

{ "LINQ к 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(); 
+1

Можете ли вы сделать дополнительный вычисленный столбец на таблице, который заполняет 'entity_program' с соответствующим числом 0s? – cfeduke

+0

это возможность, но я бы предпочел что-то многоразовое. Я не хочу создавать дополнительный столбец для каждого столбца, который мне нужно заполнить, если я смогу его избежать. – Elsimer

ответ

-4

я в конечном итоге создание списка затем переборе результатов. Когда я делаю .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(); 
12

Это не слишком элегантно, но это делает работу:

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

Спасибо за это! – David

-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. –

 Смежные вопросы

  • Нет связанных вопросов^_^