2013-04-23 6 views
7

मैं एक विशेष उपयोगकर्ता के विशिष्ट अभियान को खोजने की जरूरत को क्रियान्वित कर रहा है। उपयोगकर्ता के पास कोडराइट्स हैं, कोडराइट्स में कोड और कोड शामिल होते हैं। यहाँ 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 
+0

आप कोड क्वेरी को निष्पादित दिखा सकते हैं:

यह है जब आप अपने user वस्तु पाने के अपने प्रारंभिक क्वेरी का हिस्सा बनने का होगा? यह सवाल (http://stackoverflow.com/questions/8473705/linq-to-entities-distinct-on-one-column) इंगित करता है कि एफई ORM की है के लिए 'व्यापार बंद का उपयोग कर DISTINCT' –

+4

एक उचित क्वेरी पैदा किया जाना चाहिए कि वे "चतुर" हैं। अधिकांश समय प्रदर्शन "पर्याप्त अच्छा" होता है। लेकिन वे चतुर हैं। लेकिन आप कस्टम ओआरएम कोड लिखने में कम समय बिताते हैं। एक जहर उठाओ। एक सोचता है कि आप यह देख सकते हैं कि ईएफ क्वेरी कैसे जारी करता है और देखता है कि कोई इंडेक्स है जो जोड़ने के लायक है या नहीं। – granadaCoder

+0

@ w.brian कृपया संपादन देखें। –

उत्तर

10

आप समय बिताना चाहिए Fetch Plans for Entity Framework को देख के लिए मार डाला जा रहा है। एफई के लिए आदेश में शामिल होने के लिए प्रदर्शन करने के लिए आपको Include कीवर्ड का उपयोग करना होगा।

var user = context.Users 
    .Include("CodeRights.Code") 
    .Include("CodeRights.Campaign") 
    .FirstOrD‌​efault(u => u.Id == id); 
+0

CodeRights नहीं हो सकता "शामिल करें" वहाँ बहुत प्रकार CodeRight का एक संग्रह है। –

+1

'Include' को क्वेरी का एक हिस्सा होने की आवश्यकता है जो उपयोगकर्ता को लौटाता है, जैसे' var user = context.Users.Include ("CodeRights.Code") शामिल करें ("CodeRights.Campaign")। FirstOrDefault (u = > u.Id == आईडी); ' –

+0

@ApurvGupta अपडेट किया गया। – mattytommo

संबंधित मुद्दे