2010-08-20 3 views
9

डिज़ाइन में लिनक कोड डिज़ाइन करने के आपके सुझाव क्या हैं? विशेष रूप से, मैं बड़े और जटिल linq प्रश्नों के कोड डिजाइन में दिलचस्प हूँ?LINQ कोड

उदाहरण के लिए, आप जानते हैं, कि आप बहुत बड़ा LINQ सामान का एक बहुत लिखने के लिए की जरूरत है, हो सकता है आपके कोड के कुछ डुप्लिकेट भागों होगा, शायद नहीं है, और आप की जरूरत है:

  1. आसानी से कोड बनाने सहायक - मतलब है, अगर आपको कुछ बदलने की जरूरत है। - आप एक चीज बदल रहे हैं, कई

  2. कोड को पढ़ने में आसान बनाएं - इसका मतलब है, अगर आपको कुछ ढूंढना है - तो आप आसानी से ऐसा कर सकते हैं।

आप अपने उदाहरणों का उपयोग कर सकते हैं, शायद आपका अभ्यास। हो सकता है कि कुछ पैटर्न, जिन्हें आपने कहीं भी देखा - कुछ भी।

कह LINQ मेरा मतलब है किसी भी LINQ, एसक्यूएल को LINQ, वस्तुओं के लिए LINQ, xml करने के लिए LINQ, आदि

Tnx

+1

अपने पसंदीदा उत्तर को चिह्नित करने के लिए मत भूलना। नेटसाइड का जवाब एक अच्छा उम्मीदवार होगा। – Steven

उत्तर

7

आप अपनी वस्तुओं के लिए एक्सटेंशन लिख सकते हैं;

मुख्य कोड;

IQuerable itemList = _coreRepository.GetSomeItems() 
       .WithStates(OperationIdentity.SendToSomeWhere) 
       .BetweenDates(StartDate, EndDate); 

एक्सटेंशन;

public static IQueryable<SomeObject> BetweenDates(this IQueryable<SomeObject> query, DateTime startDate, DateTime endDate) 
     { 
      return from p in query 
        where p.CompletedDate >= startDate && p.CompletedDate < endDate 
        select p; 
     } 
3

मैं बड़े चयन विवरणों को अलग करना चाहता हूं जिन्हें विस्तार विधियों का उपयोग करके कई बार उपयोग किया जाता है।

public static IQueryable<SomeEntityPM> SelectEntityPM(this IQueryable<SomeEntity> entities) 
{ 
    return entities.Select(a => new SomeEntityPM { ... }); 
} 

उपयोग: इस के लिए

ObjectCtx.SomeEntities.SelectEntityPM(); 
2

एक उपयोगी पैटर्न एक पुन: प्रयोज्य विधेय पुस्तकालय पैदा कर रही है। अधिक जानकारी के लिए इस पृष्ठ को LINQ PredicateBuilder पर देखें।

2

एक vew चीजें मैं अक्सर करते हैं:

1) लेआउट: हमेशा अगली पंक्ति में एक प्रश्न शुरू करते हैं। उदाहरण: इस

var allCustomersThatDontContainUnpayedOrders = from customer in db.Customers 
               where customer.Orders ... 
               select customer; 

करना नहीं करते हैं लेकिन ऐसा करते हैं:

var allCustomersThatDontContainUnpayedOrders = 
    from customer in db.Customers 
    where customer.Orders ... 
    select customer; 

2) कई where खंड का उपयोग करें जहां आप कर सकते हैं। मैं दूसरे स्निपेट को पहले से अधिक पठनीय खोजने की कोशिश करता हूं:

var results = 
    from customer in db.Customers 
    where customer.Name.Contains(search) && customer.Address.City != null && 
     customer.Employee.IsSenior 
    select customer; 

var results = 
    from customer in db.Customers 
    where customer.Name.Contains(search) 
    where customer.Address.City != null 
    where customer.Employee.IsSenior 
    select customer; 

3) यदि आप कर सकते हैं तो शामिल होने से रोकें। LINQ से SQL अक्सर आपको join कथनों को समझने के बिना सभी अभिभावक-बाल संबंधों पर 'डॉट' करने की अनुमति देता है।

4) अक्सर आप देखेंगे कि कई प्रश्न समान दिखते हैं। आप हमेशा उपयोगकर्ता के अधिकारों के आधार पर कुछ रिकॉर्ड फ़िल्टर करना चाहते हैं।आप इस कोड को विधि में निकाल सकते हैं:

var customers = db.Customers; 

customers = FilterBasedOnUserRights(customers, currentUser); 

public static IQueryable<Customer> FilterBasedOnUserRights(
    IQueryable<Customers customers, User currentUser) 
{ 
    return 
     from customer in customers 
     where [big complicated where clause] 
     select customer; 
}