Операция со встроенной строкой linq - PullRequest
0 голосов
/ 07 января 2012

У меня есть метод, который возвращает это исключение.LINQ to Entities не распознает метод метода System.String stringCutter (System.String), и этот метод нельзя преобразовать в выражение хранилища.

      public List<ProductReqNoDate> GetRequestsQuery()
    {
      var query = (from r in db.talepler
                     select new ProductReqNoDate
                     {
                         talepEdenBirim = r.talepEdenBirim,
                         talepNo = r.talepNo,
                         talepTarihi = r.talepTarihi,
                         urunAdi = stringCutter((from p in db.urunler
                                                 where p.talepNo == r.talepNo
                                                 select p.urunAd).FirstOrDefault()) // <--This
                     }).AsQueryable();
     return query.ToList();
     }
       string stringCutter(string txt)
    {
        return string.IsNullOrEmpty(txt) ? "" : txt.Length <= 30 ? txt : txt.Substring(0, 30) + "...";
    }

, когда я использую строковые операции в строке, онработает.но это слишком долго,

      urunAdi = ((from p in db.urunler where p.talepNo == r.talepNo select p.urunAd).FirstOrDefault()).Length <= 30 ?
                         ((from p in db.urunler where p.talepNo == r.talepNo select p.urunAd).FirstOrDefault()) :
                         ((from p in db.urunler where p.talepNo == r.talepNo select p.urunAd).FirstOrDefault()).Substring(0, 30) + "..."

Как я могу сослаться (из p в db.urunler, где p.talepNo == r.talepNo выберите p.urunAd) .FirstOrDefault ()) как txt, возможно;поэтому я могу использовать встроенный метод stringCutter, например:

     urunAdi=string.IsNullOrEmpty(txt) ? "" : txt.Length <= 30 ? txt : txt.Substring(0, 30) + "...";

Есть ли способ сократить этот код.спасибо

Ответы [ 2 ]

1 голос
/ 07 января 2012

EF пытается отобразить функцию stringCutter в SQL.Что он не может, потому что он не знает об этом.Встроенная версия использует только те функции, которые EF знает для сопоставления с выражениями / функцией SQL.

0 голосов
/ 07 января 2012

IQueryable<> не может преобразовать ваше выражение для использования с внутренним хранилищем. Сначала вам нужно перенести строку в память, затем вы можете использовать метод проекции IEnumerable<> для вызова вашего метода, например:

return (from r in db.talepler
    select new // First, use an anonymous type to read the building blocks
    {
        r.talepEdenBirim,
        r.talepNo,
        r.talepTarihi,
        urunAdiStr = (from p in db.urunler
            where p.talepNo == r.talepNo
            select p.urunAd).FirstOrDefault()
    }
).AsQueryable()
.ToList() // Force the data into memory
.Select(anon => new ProductReqNoDate {
    talepEdenBirim = anon.talepEdenBirim,
    talepNo = anon.talepNo,
    talepTarihi = anon.talepTarihi,
    urunAdi = stringCutter(anon.urunAdiStr) // Now stringCutter is available
}).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...