【问题标题】:Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains 运算符除外
【发布时间】:2011-05-09 11:34:49
【问题描述】:

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

报告过程中发生错误 加工。本地序列不能 在 LINQ to SQL 实现中使用 除包含之外的查询运算符 运算符。

我的代码:

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&lt;StokEnvanteriSatiri&gt;StokEnvanterSatiri 列表,我知道问题是我试图将内存列表与SQL 表连接起来。

有什么办法可以解决吗?

【问题讨论】:

    标签: c# linq-to-sql list


    【解决方案1】:

    我基本上颠倒了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
                 ......
    

    【讨论】:

    • 检查实际正在执行的 SQL,并确保您没有在本地提取所有记录,然后在内存中过滤它们。通过将每个表视为内存中的集合,这可能会“起作用”来检索正确的结果。 Linq-to-Sql 也可能足够聪明,可以在此处创建适当的过滤查询。我不确定。
    【解决方案2】:

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

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

    【讨论】:

    • 这不会对数据库进行过滤,并且会从数据库中提取比必要更多的记录。
    • @Samuel Neff:这只是一个假设......我回答了最初的问题,即“如何加入内存中的集合”。
    • 一个导致用户做他们绝对不应该做的事情的答案不是,IMO,一个很好的答案。
    【解决方案3】:

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

    【讨论】:

    • 谢谢内夫先生,我正在考虑这个解决方案。
    猜你喜欢
    • 2012-12-06
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多