除Contains运算符外,本地序列不能用于查询运算符的LINQ to SQL实现

时间:2011-05-09 11:34:50

标签: c# linq-to-sql list

我在Microsoft Report Viewer组件的网页上收到此错误:

  

报告期间发生错误   处理。本地序列不能   用于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()基本上返回List<StokEnvanteriSatiri> StokEnvanterSatiri列表,我知道问题是我正在尝试使用SQL表加入内存列表。

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分: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
             ......

答案 1 :(得分:3)

您必须强制LINQ在本地评估第二个连接。你可以这样做:

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

答案 2 :(得分:2)

重写urunMD查询以分为两部分运行。使用Contains运算符过滤TBLP1URUNs中的初始记录,然后仅返回数据库数据。然后使用单独的LINQ-to-Objects查询将TBLP1URUNs中的数据库数据与urunStok中的内存数据相结合。