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

时间:2014-02-14 09:16:38

标签: 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 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();

1 个答案:

答案 0 :(得分:1)

简答:

是的......好吧,也许吧。

答案很长:

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

我们对这样的一些查询存在性能问题,因为优化器会针对某些过滤器情况(例如子句的短路)进行优化,然后当新的查询通过参数的大量变化进行时,它将需要AGES。 / p>

我们最终做了什么:

  1. 不要使用大型LINQ查询,创建存储过程或视图,以便您可以更好地控制生成的SQL。

  2. OPTION(RECOMPILE)这样的用过的东西...看起来很有用。

  3. 对不同的参数进行一些查询重载,以便DB可以单独优化它们。

  4. 显然这就是我们所做的,它可能不适合你。我强烈建议为每个不同的参数化版本获取生成的SQL,并使用您的DBA(如果有的话)或您的团队和谷歌(如果您没有)进行检查。