2011-05-09 49 views
8

我得到網頁上的這個錯誤,微軟報表查看器組件:本地序列不能在LINQ被用來查詢經營者的SQL實現除包含運營商

報告 處理過程中發生錯誤。本地序列不能是 用於LINQ to SQL實現的 查詢運算符,但Contains 運算符除外。

我的代碼:

public static IEnumerable GetUrunMiktarliDetayli() 
{ 
    Baglanti(); 
    List<StokEnvanteriSatiri> urunListesi = new List<StokEnvanteriSatiri>(); 
    urunListesi = GetUrunListesiDoldur(); 

    var urunStok = from urunS in urunListesi 
        select new 
        { 
         urunS.AcilisMiktari, 
         urunS.MevcutMiktar, 
         urunS.UrunNo 
        }; 

    var urunMD = from urun in db.TBLP1URUNs 
       join kategori in db.TBLP1URUNKATEGORIs 
           on urun.KATEGORIID equals kategori.ID 
       join a in urunStok 
         on urun.ID equals a.UrunNo 
       select new 
       { 
        DIGERGIRISLER = a.AcilisMiktari, 
        urun.URUNADI, 
        urun.URUNACIKLAMA, 
        kategori.TREENAME,       
        urun.STOKTURU, 
        urun.MARKA, 
        urun.MODEL, 
        urun.URUNTIPI, 
        urun.URUNDURUM, 
        urun.KRITIKSTOKMIKTARI, 
        urun.DEPOADI, 
        urun.YER, 
        urun.RAF, 
        urun.RAFOMRU, 
        KDVDAHILMI = urun.KDVDAHILMI==1 ? "EVET":"HAYIR", 
        urun.KDVORANI, 
        urun.SATFIYAT1, 
        urun.SATFIYAT1BIRIM, 
        urun.TEDFIYAT1, 
        urun.TEDFIYAT1BIRIM, 
        urun.HIZMETYENSURYIL, 
        urun.HIZMETYENSURAY, 
        urun.SATILANMIKTAR, 
        urun.IADEEDILENMIKTAR, 
        urun.KULLANILANMIKTAR, 
        urun.ZAYIMIKTAR, 
        urun.KONSINYECIKISMIKTAR, 
        urun.DIGERCIKISLAR, 
        urun.TEDARIKMIKTAR, 
        urun.IADEALINANMIKTAR, 
        urun.KONSINYEGIRISMIKTAR,       
        urun.EN, 
        urun.BOY, 
        urun.YUKSEKLIK, 
        urun.AGIRLIK, 
        urun.BOYUTAGIRLIGI, 
        urun.URUNKAYITTARIHI, 
        urun.GARANTISURESIBITIS, 
        urun.SONGUNCELLEMETARIHI, 
        urun.YENI, 
        urun.TESLIMATSURESI, 
        urun.TEDARIKCISTOKMIKTAR, 
       } 
       ; 
    return urunMD; 
} 

public class StokEnvanteriSatiri 
     { 
      private string urunNo; 
      private string urunAdi; 
      private int acilisMiktari; 
      private int toplamTedarikMiktari; 
      private int toplamSatisMiktari; 
      private int mevcutMiktar; 
      private decimal satisFiyati; 
      private decimal toplamTutar; 
      private string paraBirimi; 

      public string UrunNo 
      { 
       get { return urunNo; } 
       set { urunNo = value; } 
      } 

      public string UrunAdi 
      { 
       get { return urunAdi; } 
       set { urunAdi = value; } 
      } 

      public int AcilisMiktari 
      { 
       get { return acilisMiktari; } 
       set { acilisMiktari = value;} 
      } 

      public int ToplamTedarikMiktari 
      { 
       get { return toplamTedarikMiktari; } 
       set { toplamTedarikMiktari = value; } 
      } 

      public int ToplamSatisMiktari 
      { 
       get { return toplamSatisMiktari; } 
       set { toplamSatisMiktari = value; } 
      } 

      public int MevcutMiktar 
      { 
       get { return mevcutMiktar; } 
       set { mevcutMiktar = value; } 
      } 

      public decimal SatisFiyati 
      { 
       get { return satisFiyati; } 
       set { satisFiyati = value; } 

      } 

      public decimal ToplamTutar 
      { 
       get { return toplamTutar; } 
       set { toplamTutar = value; } 
      } 

      public string ParaBirimi 
      { 
       get { return paraBirimi; } 
       set { paraBirimi = value; } 
      } 

     } 

這種方法GetUrunListesiDoldur()基本上返回StokEnvanterSatiri一個List<StokEnvanteriSatiri>名單,我知道的問題是,我想加入一個在內存中的列表與SQL表。

有什麼辦法可以解決這個問題嗎?

回答

7

我基本上扭轉了join和它的工作

var urunMD = from urunStokbilgileri in urunStok 
      join urun in db.TBLP1URUNs 
         on urunStokbilgileri.UrunNo equals urun.ID 
      join kategori in db.TBLP1URUNKATEGORIs 
         on urun.KATEGORIID equals kategori.ID 
      ...... 
+0

檢查實際正在執行的SQL,並確保您沒有在本地提取所有記錄,然後在內存中對其進行過濾。有可能這個「有效」通過將每個表視爲內存中的集合來檢索正確的結果。 Linq-to-Sql也很有可能在這裏創建一個適當的過濾查詢。我不確定。 – 2011-05-09 14:37:42

+0

@Samuel謝謝你的建議Mr.Neff,我會盡力的。 – Bastardo 2011-05-09 15:02:42

2

重寫您的urunMD查詢以分兩部分運行。使用Contains運算符篩選TBLP1URUNs中的初始記錄,然後僅返回數據庫數據。然後使用單獨的LINQ到對象查詢將來自TBLP1URUNs的數據庫數據與urunStok中的內存數據組合在一起。

+0

謝謝Mr.Neff,我想這個解決方案。 – Bastardo 2011-05-09 12:36:02

3

您必須強制LINQ在本地評估第二次連接。你可以這樣做:

var urunMD = (from urun in db.TBLP1URUNs 
       join kategori in db.TBLP1URUNKATEGORIs 
           on urun.KATEGORIID equals kategori.ID).AsEnumerable() 
      .Join([...]) 
+0

這不會過濾數據庫,並且會從數據庫中獲取比需要更多的記錄。 – 2011-05-09 12:27:39

+0

@Samuel Neff:這只是一個假設......我回答了原來的問題,即「如何加入內存中的收藏」。 – 2011-05-09 12:33:11

+0

謝謝,我會嘗試。 – Bastardo 2011-05-09 12:34:16