2012-01-07 4 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) + "..." 

がどのように私は(p.talepNo == r.talepNoがp.urunAdを選択db.urunlerのpから)参照することができ.FirstOrDefault())多分、TXTなど。だから私はlikelineのようなstringCutterメソッドを使用することができます:

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

このコードを短縮する方法はありますか? 、thanks

答えて

0

IQueryable<>バックエンドストアで使用する式を変換できません。

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

私はそれをやってみたかったのすべてだということ:あなたは、あなたはこのように、あなたのメソッドを呼び出すためにIEnumerable<>の投影方法を使用することができ、最初のメモリに文字列を持参する必要があります。どうもありがとうございます – blackraist

1

EFは、関数stringCutterをSQLにマップしようとしています。それはそれについて知りませんのでできません。インライン・バージョンは、EFがSQL式/関数にマップすることがわかっている関数のみを使用します。