C# LINQ到SQL划分过滤器以获得更好的性能

C# LINQ到SQL划分过滤器以获得更好的性能,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有以下LINQ到SQL查询 var kayitlarFiltreli = from rows in db.TBLP1CARIs orderby rows.ID descending where rows.HESAPADI.ToLower().Contains(filter.ToLower()) || (rows.

我有以下LINQ到SQL查询

var kayitlarFiltreli = from rows in db.TBLP1CARIs
                       orderby rows.ID descending
                       where rows.HESAPADI.ToLower().Contains(filter.ToLower()) ||
                                              (rows.CARITURU == "Bireysel" ?
                                               rows.B_ADSOYAD.ToLower().Contains(filter.ToLower()) :
                                               rows.K_FIRMAADI.ToLower().Contains(filter.ToLower())) ||
                                               rows.ID.ToString().Contains(filter)
                       select rows;

var kayitlarBakiyeli = from rows in kayitlarFiltreli
                       select new
                                   {
                                       HESAPNO = rows.ID,
                                       HESAPADI = rows.HESAPADI,
                                       CARIADI = (rows.CARITURU == "Bireysel" ? rows.B_ADSOYAD : rows.K_FIRMAADI),
                                       Bakiye = get_bakiye(rows.ID, rows.LISTEPARABIRIMI)
                                   };

var kayitlarSon = from rows in kayitlarBakiyeli
                  select new
                            {  rows.HESAPNO,
                               rows.HESAPADI,
                               rows.CARIADI,
                               Bakiye = rows.Bakiye.Contains(".") == true ?
                                        rows.Bakiye.TrimEnd('0').TrimEnd('.') :
                                        rows.Bakiye

                            };
我有性能问题,我的意思是查询响应至少在15秒后,当它部署到网站时,使用这些查询填充
网格视图的页面至少需要5秒
get_bakiye(p1,p2,…)
是一个带有
for
的长方法,一个
foreach
和一个Linq-to-SQL查询。我想大部分时间都花在了
get_-bakiye
上,我已经很费劲了,响应时间缩短了2秒,但是仍然很慢。我正在尝试让上面的查询更快地工作

我试过了

var kayitlarSirali =  from rows in db.TBLP1CARIs
                      orderby rows.ID descending
                      select rows;

var kayitlarFiltreli = from rows in kayitlarSirali
                       where rows.HESAPADI.ToLower().Contains(filter.ToLower()) ||
                                        (rows.CARITURU == "Bireysel" ? 
                                         rows.B_ADSOYAD.ToLower().Contains(filter.ToLower()) : 
                                         rows.K_FIRMAADI.ToLower().Contains(filter.ToLower())) ||
                                         rows.ID.ToString().Contains(filter)
                       select rows;
其余的都一样。 基本上,我只是将过滤部分与
Contains()
分开,我不确定这是否有多大帮助

在查询数据库时,将
中的
分离出来好吗?我的意思是,在数据库中查询一次并将结果放入内存IQueryable中,然后在其上执行其余操作,对性能是否更好

为了让这些查询更快地工作,您有什么建议? 这是
get_bakiye()
方法,这不是我完整编写的方法,但我应该让它执行得更快

public static string get_bakiye(int cari_id, string birim_kod)
        {
            return get_bakiye(cari_id, DAL.DAOCari.GetEntity(cari_id).LISTEPARABIRIMI, null,false);
        }

public static string get_bakiye(int cari_id, string birim_kod, List<BAL.P_CariBakiyeTablosu> custom_rapor, bool borcluTespit)
        {
            VeriyazDBDataContext db = new VeriyazDBDataContext(); db.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;

            decimal return_bakiye = 0;

            if (birim_kod == null || birim_kod.Trim() == "") //default
                birim_kod = "TL";

            //devir bakiyesini hesapla:
            List<BAL.P_CariBakiyeTablosu> bakiyeler = new List<BAL.P_CariBakiyeTablosu>();
            if (custom_rapor == null)
                bakiyeler = CariBakiyeRaporuOlustur(cari_id, true);
            else
                bakiyeler = custom_rapor;

            bakiyeler.RemoveAt(0);

            List<TBLP1DOVIZTANIMLARI> dovizTanimlariTumListe = DAL.DAOdoviztanimlari.SelectAll().ToList();
            //devirleri hesaplarken döviztanimlari tablosundaki varsayılan kuru kullanıyor
            for (int i = 0; i < bakiyeler.Count; i++)
            {
                if (bakiyeler[i].DOVIZ == birim_kod)
                {
                    return_bakiye = return_bakiye + Convert.ToDecimal(bakiyeler[i].DEVIR);
                }
                else
                {
                    decimal from_kur = 1;
                    from_kur = from_kur = dovizTanimlariTumListe.Where(rows => rows.TBLP1DOVIZLER.KOD == bakiyeler[i].DOVIZ).FirstOrDefault().VARSAYILANKUR.GetValueOrDefault(1);

                    decimal to_kur = 1;
                    to_kur = dovizTanimlariTumListe.Where(rows => rows.TBLP1DOVIZLER.KOD == birim_kod).First().VARSAYILANKUR.GetValueOrDefault(1);


                    return_bakiye = return_bakiye + (Convert.ToDecimal(bakiyeler[i].DEVIR) * (from_kur / to_kur));
                }
            }

            //islem bakiyesini hesapla:

            var islemler = from rows in db.TBLP1ISLEMs
                           where
                           rows.CARI_ID == cari_id &&
                           rows.TEKLIF.GetValueOrDefault(false) == false &&
                           rows.SOZLESME.GetValueOrDefault(false) == false &&
                           (rows.SIPARISDURUMU == "İşlem Tamamlandı" || 
                            rows.SIPARISDURUMU == "Hazırlanıyor" || 
                            rows.SIPARISDURUMU == "" || 
                            rows.SIPARISDURUMU == null)
                           select rows;

            //var dovizKuruOlanIslemler = from dovizKuruRow in db.TBLP1DOVIZKURUs
            //                            select dovizKuruRow.ISLEM_ID;

            foreach (var item in islemler)
            {
                decimal from_kur = 1;
                decimal fromKurVarsayilan = 1;
                //belirtilen dövizin varsayılanını çekiyor
                fromKurVarsayilan = dovizTanimlariTumListe.Where(rows => rows.TBLP1DOVIZLER.KOD == item.PARABIRIMI).FirstOrDefault().VARSAYILANKUR.GetValueOrDefault(1);

                try
                {
                    from_kur = item.KURDEGERI.Value;
                    //aşağıdaki satırda dövizkuru tablosundan işleme ait kuru çekerek hesap yapıyordu, işlem tablosuna KURDEGERİ kolonu ekleyince
                    //buna gerek kalmadı, yukarıdaki satırda işleme ait kur değeri işlem tablosundan çekiyor.
                    //from_kur = item.TBLP1DOVIZKURUs.Where(rows => rows.DOVIZBIRIM == item.PARABIRIMI).FirstOrDefault().KUR.GetValueOrDefault();
                }
                catch
                {
                    from_kur = fromKurVarsayilan;
                }

                //carinin para biriminin varsayılan kurunu çekiyor
                decimal to_kur = 1;
                decimal toKurVarsayilan = 1;

                toKurVarsayilan = dovizTanimlariTumListe.Where(rows => rows.TBLP1DOVIZLER.KOD == birim_kod).FirstOrDefault().VARSAYILANKUR.GetValueOrDefault(1);

                to_kur = toKurVarsayilan;


                if (item.CARIISLEMTURU == "BORC")
                {
                    return_bakiye = return_bakiye + (Convert.ToDecimal(item.GENELTOPLAM) * (from_kur / to_kur));
                }
                if (item.CARIISLEMTURU == "ALACAK")
                {
                    return_bakiye = return_bakiye - (Convert.ToDecimal(item.GENELTOPLAM) * (from_kur / to_kur));
                }
            }

            string returnBakiyeParaFormatli = DAL.Format.ParaDuzenle.ParaFormatDuzenle(return_bakiye.ToString());
            if (borcluTespit==true)
            {
                return return_bakiye.ToString();
            }
            if (returnBakiyeParaFormatli.Contains(".") == true)
            {
                return returnBakiyeParaFormatli.TrimEnd('0').TrimEnd('.') + " " + birim_kod;

            }
            else
            {
                return returnBakiyeParaFormatli + " " + birim_kod;
            }

        }
    }
公共静态字符串get_bakiye(int cari_id,字符串birim_kod)
{
返回get_bakiye(cari_id,DAL.DAOCari.GetEntity(cari_id).listparabirimi,null,false);
}
公共静态字符串get_bakiye(int cari_id,string birim_kod,List custom_rapor,bool borcluTespit)
{
VeriyazDBDataContext db=new VeriyazDBDataContext();db.Connection.ConnectionString=System.Configuration.ConfigurationManager.ConnectionString[“LocalSqlServer”].ConnectionString;
十进制返回_bakiye=0;
if(birim_kod==null | | birim_kod.Trim()==“”)//默认值
birim_kod=“TL”;
//德维尔·巴基耶西尼·赫萨普拉:
List bakiyeler=新列表();
if(自定义参数==null)
bakiyeler=CariBakiyeRaporuOlustur(cari_id,true);
其他的
bakiyeler=定制rapor;
bakiyeler.RemoveAt(0);
List doviztanimlaritumlist=DAL.DAOdoviztanimlari.SelectAll().ToList();
//德维莱里·赫萨帕肯·德维兹塔尼姆拉里·塔布桑达基·瓦赛·库伦·库伦·约尔(Devilleri Hesaplken döviztanimlari tablosundaki varsayılan kullanıyor)
for(int i=0;irows.TBLP1DOVIZLER.KOD==bakiyeler[i].DOVIZ.FirstOrDefault().VARSAYILANKUR.GetValueOrDefault(1);
十进制到_kur=1;
to_kur=doviztanimlaritumlist.Where(rows=>rows.TBLP1DOVIZLER.KOD==birim_KOD).First().VARSAYILANKUR.GetValueOrDefault(1);
return_bakiye=return_bakiye+(Convert.ToDecimal(bakiyeler[i].DEVIR)*(from_kur/to_kur));
}
}
//islem bakiyesini hesapla:
var islemler=来自db.TBLP1ISLEMs中的行
哪里
rows.CARI_ID==CARI_ID&&
rows.TEKLIF.GetValueOrDefault(false)=false&&
rows.SOZLESME.GetValueOrDefault(false)=false&&
(rows.siparidurumu==“lem Tamamland”|124;
rows.siparisturumu==“Hazırlanıyor”|
rows.siparisturumu==“”| |
rows.SIPARISDURUMU==null)
选择行;
//var dovizKuruOlanIslemler=来自db.TBLP1DOVIZKURUs中的dovizKuruRow
//选择dovizKuruRow.ISLEM_ID;
foreach(islemler中的var项)
{
_kur的小数=1;
Kurvarsayilan的十进制数=1;
//贝里蒂伦·德维辛·瓦萨伊兰·恩塞基奥尔(belirtilen dövizin varsayılanınıekiyor)
fromKurVarsayilan=doviztanimlaritumlist.Where(rows=>rows.TBLP1DOVIZLER.KOD==item.PARABIRIMI).FirstOrDefault().VARSAYILANKUR.GetValueOrDefault(1);
尝试
{
from_kur=item.KURDEGERI.Value;
//一位来自塔布卢桑达的记者说,我是一位来自亚普约杜的记者,我是塔布卢纳·库尔德格·科洛努·埃克莱因斯(kolonu ekleyince)
//布纳·格雷克·卡尔马德、尤卡尔·达基·萨尔达·伊莱姆和库尔德·德埃里·伊莱姆·塔布卢桑达·埃基约尔。
//from_kur=item.TBLP1DOVIZKURUs.Where(rows=>rows.DOVIZBIRIM==item.PARABIRIMI).FirstOrDefault().kur.GetValueOrDefault();
}
抓住
{
from_kur=from kurvarsayilan;
}
//carinin para biriminin varsayılan kurunuçekiyor
十进制到_kur=1;
十进制toKurVarsayilan=1;
toKurVarsayilan=dovizTanimlariTumListe.Where(rows=>rows.TBLP1DOVIZLER.KOD==birim_KOD).FirstOrDefault().VARSAYILANKUR.GetValueOrDefault(1);
to_kur=toKurVarsayilan;
如果(项目CARIISLEMTURU==“BORC”)
{
return_bakiye=return_bakiye+(将.ToDecimal(item.GENELTOPLAM)*(from_kur/to_kur));
}
如果(item.carisilemturu==“ALACAK”)
{
return_bakiye=return_bakiye-(将.ToDecimal(item.GENELTOPLAM)*(from_kur/to_kur));
}
}
字符串returnBakiyeParaFormatli=DAL.Format.ParaDuzenle.ParaFormatDuzenle(return_bakiye.ToString());
如果(borcluTespit==真)
{
return_bakiye.ToString();
}
如果
List<TBLP1DOVIZTANIMLARI> dovizTanimlariTumListe = DAL.DAOdoviztanimlari.SelectAll().ToList();