2012-01-07 60 views
0

我有一個方法返回這個異常。 LINQ to Entities不識別方法'System.String stringCutter(System.String)'方法,並且此方法不能轉換爲存儲表達式。linq內嵌字符串操作

 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) + "..." 

我怎麼能指(上接第在db.urunler其中p.talepNo == r.talepNo選擇p.urunAd).FirstOrDefault())爲TXT可能;所以我可以使用stringCutter內聯方法如:

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

是否有縮短此代碼的方法。 ,謝謝

回答

0

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

這就是我想做的事吧。非常感謝 – blackraist 2012-01-07 12:26:29

1

EF試圖將函數stringCutter映射到SQL中。它不能,因爲它不知道它。內聯版本只使用EF知道映射到SQL表達式/函數的函數。