C# LINQ到SQL划分过滤器以获得更好的性能
我有以下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.
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();