无法将表达式转换为sql

时间:2011-04-22 13:25:15

标签: c# .net linq linq-to-sql c#-4.0

使用以下代码我收到此错误

InvalidOperationException

  

无法翻译表达式   stok_getmiktar_byyapilanislem(urunler.ID, "SATIS")进入SQL而无法对待   它作为一种本地表达。

var urundb = (from urunler in db.TBLP1URUNs
              orderby urunler.SERIAL
              where (urunler.ID.Contains(FilitreText) || urunler.URUNADI.Contains(FilitreText))
              && ((kategori1.SERIAL == null) || urunler.SERIAL.StartsWith(kategori1.SERIAL))
              select new
              {
                  UrunNo = urunler.ID,
                  UrunAdi = urunler.URUNADI,
                  Marka = urunler.MARKA,
                  SatisFiyati = urunler.SATFIYAT1.GetValueOrDefault(0),//.ToString() + " " + urunler.SATFIYAT1BIRIM,
                  TedarikFiyati = urunler.TEDFIYAT1.GetValueOrDefault(0),//.ToString() + " " + urunler.TEDFIYAT1BIRIM,
                  PiyasaFiyati = urunler.SATFIYAT2.GetValueOrDefault(0),//.ToString() + " " + urunler.SATFIYAT2BIRIM,

                  Hizmet = (urunler.HIZMETYENSURYIL > 0 && urunler.HIZMETYENSURAY > 0 ?
                                    urunler.HIZMETYENSURYIL.ToString() + " Yıl " + urunler.HIZMETYENSURAY.ToString() + " Ay"
                                : (urunler.HIZMETYENSURYIL > 0 && urunler.HIZMETYENSURAY <= 0 ?
                                        urunler.HIZMETYENSURYIL.ToString() + " Yıl"
                                    : (urunler.HIZMETYENSURYIL <= 0 && urunler.HIZMETYENSURAY > 0 ?
                                            urunler.HIZMETYENSURAY.ToString() + " Ay"
                                            : ""))),
                  TedarikEdilenMiktar = DAOUrun.stok_getmiktar_byyapilanislem(urunler.ID, "TEDARIK"),//this one works fine
                  SatilanMiktar = DAOUrun.stok_getmiktar_byyapilanislem(urunler.ID, "SATIS"),//this one works fine                              

                  Stok = urunler.TEDARIKCISTOKMIKTAR.GetValueOrDefault(0) 
                       - DAOUrun.stok_getmiktar_byyapilanislem(urunler.ID, "SATIS")//error occurs with this one

              });
下面的

stok_getmiktar_byyapilanislem

public static double stok_getmiktar_byyapilanislem(string urun_id, string yapilanislem)
{
    VeriyazDBDataContext db = new VeriyazDBDataContext(); db.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;

    double miktar = (from rows in db.TBLP1ISLEMDETAYs
                     where rows.URUN_ID == urun_id && rows.TBLP1ISLEM.YAPILANISLEM == yapilanislem
                     select rows.MIKTAR).Sum().GetValueOrDefault(0);

    return miktar;
}

我该如何解决?

1 个答案:

答案 0 :(得分:2)

对于那些可能遇到或遭受此错误的人 检查Custom Method in LINQ to SQL queryCalling functions in LINQ queries

他们说我们不能在linq中调用我们自己的函数/方法,实际上我们可以但是当我尝试从该查询中获取某些内容时,它会在我的问题中抛出引用的异常。我真的很想知道为什么会这样做

SatilanMiktar = DAOUrun.stok_getmiktar_byyapilanislem(urunler.ID, "SATIS"),

有效,但这个没有

Stok = urunler.TEDARIKCISTOKMIKTAR.GetValueOrDefault(0) - DAOUrun.stok_getmiktar_byyapilanislem(urunler.ID, "SATIS")

我刚写了一些像这样的其他方法:

public static double GetMevcutMiktar(string urunId,double acilisMiktari) 
{
    double mevcutMiktar = 0;
    mevcutMiktar = acilisMiktari - stok_getmiktar_byyapilanislem(urunId, "SATIS")
    return mevcutMiktar;
}

而不是

urunler.TEDARIKCISTOKMIKTAR.GetValueOrDefault(0) - DAOUrun.stok_getmiktar_byyapilanislem(urunler.ID, "SATIS")