मैं एक विशेष उपयोगकर्ता के विशिष्ट अभियान को खोजने की जरूरत को क्रियान्वित कर रहा है। उपयोगकर्ता के पास कोडराइट्स हैं, कोडराइट्स में कोड और कोड शामिल होते हैं। यहाँ CodeRight वर्ग हैइकाई की रूपरेखा बहुत सारी क्वेरी
public class SmartCodeRight
{
[Key, Column(Order = 1)]
public long UserId { get; set; }
public virtual User User { get; set; }
[Key, Column(Order = 2)]
public long CodeId { get; set; }
public virtual SmartCode Code { get; set; }
public CodeRight CodeRight { get; set; }
}
मैं इसके लिए निम्नलिखित एसक्यूएल लिखते थे:
SELECT *
FROM campaigns
WHERE campaignid IN (SELECT DISTINCT campaignid
FROM smartcodes t1
INNER JOIN smartcoderights t2 ON t1.codeId = t2.codeId
WHERE t2.userid = @userId)
एफई का उपयोग करते हुए मैं इस कोड लिख रहा हूँ:
var v = user.CodeRights.Select(r => r.Code.Campaign).Distinct().ToList();
अब रूपरेखा पर मुझे लगता है कि देख रहा हूँ ईएफ प्रत्येक कोडराइट उपस्थिति के लिए 2 एसक्यूएल प्रश्न निष्पादित कर रहा है।
मैंने पूरे निष्पादन के समय की गणना भी की है और ईएफओ का उपयोग करते समय ~ 400 एमएस लेता है यह केवल ~ 8 है।
अब मेरे सवाल है कि एफई वास्तव में इस धीमी गति से या मैं कुछ गलत कर रहा हूँ है अगर है?
संपादित करता
दो ब्लॉकों के बाद हर CodeRight
exec sp_executesql N'SELECT
[Extent1].[CodeId] AS [CodeId],
[Extent1].[CodeTitle] AS [CodeTitle],
[Extent1].[CodeContent] AS [CodeContent],
[Extent1].[CreatedOn] AS [CreatedOn],
[Extent1].[IsActive] AS [IsActive],
[Extent1].[Deleted] AS [Deleted],
[Extent1].[OwnerId] AS [OwnerId],
[Extent1].[Tags] AS [Tags],
[Extent1].[CampaignId] AS [CampaignId]
FROM [dbo].[SmartCodes] AS [Extent1]
WHERE [Extent1].[CodeId] = @EntityKeyValue1',N'@EntityKeyValue1 bigint',@EntityKeyValue1=24
go
और
exec sp_executesql N'SELECT
[Extent1].[CampaignId] AS [CampaignId],
[Extent1].[Name] AS [Name],
[Extent1].[Description] AS [Description],
[Extent1].[AdminId] AS [AdminId]
FROM [dbo].[Campaigns] AS [Extent1]
WHERE [Extent1].[CampaignId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=12
go
आप कोड क्वेरी को निष्पादित दिखा सकते हैं:
यह है जब आप अपने
user
वस्तु पाने के अपने प्रारंभिक क्वेरी का हिस्सा बनने का होगा? यह सवाल (http://stackoverflow.com/questions/8473705/linq-to-entities-distinct-on-one-column) इंगित करता है कि एफई ORM की है के लिए 'व्यापार बंद का उपयोग कर DISTINCT' –एक उचित क्वेरी पैदा किया जाना चाहिए कि वे "चतुर" हैं। अधिकांश समय प्रदर्शन "पर्याप्त अच्छा" होता है। लेकिन वे चतुर हैं। लेकिन आप कस्टम ओआरएम कोड लिखने में कम समय बिताते हैं। एक जहर उठाओ। एक सोचता है कि आप यह देख सकते हैं कि ईएफ क्वेरी कैसे जारी करता है और देखता है कि कोई इंडेक्स है जो जोड़ने के लायक है या नहीं। – granadaCoder
@ w.brian कृपया संपादन देखें। –