linq内联字符串操作

时间:2012-01-07 12:04:41

标签: string linq substring

我有一个返回此异常的方法。 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) + "..."

我如何引用(从db.urunler中的p,其中p.talepNo == r.talepNo选择p.urunAd).FirstOrDefault())作为txt可能;所以我可以使用stringCutter方法内联,如:

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

有没有办法缩短这段代码。 ,谢谢

2 个答案:

答案 0 :(得分:1)

EF正在尝试将函数stringCutter映射到SQL。它不能,因为它不知道它。内联版本仅使用EF知道映射到SQL表达式/函数的函数。

答案 1 :(得分: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();