Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 当同一查询的参数每次更改时,编译后的查询是否有效?_Linq_Entity Framework_Entity Framework 5 - Fatal编程技术网

Linq 当同一查询的参数每次更改时,编译后的查询是否有效?

Linq 当同一查询的参数每次更改时,编译后的查询是否有效?,linq,entity-framework,entity-framework-5,Linq,Entity Framework,Entity Framework 5,我不熟悉实体框架。我正在使用一个linq查询,它将从数据库中获取许多记录(多达数百万条)。在条件中有许多过滤器参数,在每个请求中参数都可能更改。所以我想知道编译后的查询在这种情况下是有效的,还是在每个请求上都是一个新的查询。我的问题是: List<FarmerDetailsReport> fdr = (from fp in mstfp join pd in personalDetails on fp.personDetails.Id equals pd.Id join ic in

我不熟悉实体框架。我正在使用一个linq查询,它将从数据库中获取许多记录(多达数百万条)。在条件中有许多过滤器参数,在每个请求中参数都可能更改。所以我想知道编译后的查询在这种情况下是有效的,还是在每个请求上都是一个新的查询。我的问题是:

List<FarmerDetailsReport> fdr = 
(from fp in mstfp join pd in personalDetails on fp.personDetails.Id equals pd.Id
join ic in identityCertificate on fp.identityCertificate.Id equals ic.Id 
join pid in pacsInsuranceData on fp.pacsInsuranceData.Id equals pid.Id into temp
from pid in temp.DefaultIfEmpty()
join bd in bankDetails on fp.bankDetails.Id equals bd.Id
join cd in contactDetails on fp.contactDetails.Id equals cd.Id
join id in incomeDetails on fp.incomeDetails.Id equals id.Id into tmp
from id in tmp.DefaultIfEmpty()
join ua in userAttributes on fp.UserId equals ua.EmailID 

where ((ua.CompanyName == companyName ) && (cd.District == model.DistrictForProfileMIS ) && (cd.Block == model.BlockForProfileMIS) && (bd.bankName == model.BankForProfileMIS ) && Status == "Active")

select new FarmerDetailsReport { .......... }).ToList();
列表fdr=
(从mstfp中的fp加入fp.personDetails.Id上personalDetails中的pd等于pd.Id
在fp.identityCertificate.Id上的identityCertificate中加入ic等于ic.Id
将fp.pacsInsuranceData.Id等于pid.Id的pacsInsuranceData中的pid连接到temp中
来自temp.DefaultIfEmpty()中的pid
将bd加入fp.bankDetails.Id上的bankDetails等于bd.Id
在fp.contactDetails.Id等于cd.Id的contactDetails中加入cd
将fp.incomeDetails.id等于id.id的incomeDetails中的id加入tmp
来自tmp.DefaultIfEmpty()中的id
在fp.UserId等于ua.EmailID的userAttributes中加入ua
其中((ua.CompanyName==CompanyName)&&(cd.District==model.DistrictForProfileMIS)&&(cd.Block==model.BlockForProfileMIS)&&(bd.bankName==model.BankForProfileMIS)&&Status==Active)
选择new FarmerDetailsReport{………}).ToList();
简短回答:

是的。。。。。。嗯,也许吧

长答覆:

这很难回答,因为您无法控制生成的实际SQL

我们在一些查询中遇到了perf问题,比如优化器会针对特定的湿过滤器情况(如子句短路)进行优化,然后当新查询的参数发生巨大变化时,它会花费很长时间

我们最后做了什么:

  • 不要使用大型LINQ查询,而是创建一个存储过程或视图,在其中您可以对生成的SQL进行更多的控制

  • 使用了类似于
    选项(重新编译)
    。。。查一下这个很有用

  • 对不同参数的查询进行一些重载,以便数据库可以分别对其进行优化

  • 显然这正是我们所做的,它可能不适合你。我强烈建议您为每个不同的参数化版本获取生成的SQL,并与您的DBA(如果有)或您的团队和google(如果没有)一起检查