2015-03-15 18 views
5

साथ संस्थाओं के लिए LINQ का उपयोग करने चलो कहते हैं कि मैं निम्नलिखित मॉडल हैं:सबसे अच्छा तरीका है एक संग्रह संपत्ति

Cities and Trainstations

आप देख सकते हैं प्रत्येक शहर में एक या अधिक रेलवे स्टेशन है।

और मैं निम्न प्रकार है:

public List<CityDTO> GetCities() 
    { 
     using (var db = new CityDataContext()) 
     { 

      var cities = db.Cities; 
      var trainstations = db.TrainStations; 

      var query = 
      (from city in cities 
      select new CityDTO 
      { 
       CityName = city.Name, 
       StateName = city.State 

      }).ToList(); 

      return query; 
     } 
    } 

प्रश्न:

public class CityDTO 
{ 
    public string CityName { get; set; } 
    public string StateName { get; set; } 
    public List<string> Trainstations { get; set; } 
} 

अब LINQ बारे में अच्छी बात यह है कि मैं इकाई की रूपरेखा क्वेरी और मेरी प्रकार का एक नया संग्रह लौट सकते है है: क्या मैं अपने सिटीडीटीओ कक्षा में जोड़ने के लिए उसी LINQ क्वेरी में रेलवे स्टेशन के नामों का संग्रह भी वापस कर सकता हूं?

public List<CityDTO> GetCities() 
    { 
     using (var db = new CityDataContext()) 
     { 

      var cities = db.Cities; 
      var trainstations = db.TrainStations; 

      var query = 
      (from city in cities 
      join trainstation in trainstations 
      on city.CityId 
      equals trainstation.CityId into orderGroup 
      select new CityDTO 
      { 
       CityName = city.Name, 
       StateName = city.State 
       //assign List<string> of trainstation names to CityDTO.Trainstations 

      }).ToList(); 

      return query; 
     } 
    } 

के साथ ऊपर से जुड़ें अन्य समस्या यह है कि (अपने ट्रेन स्टेशनों से प्रत्येक के लिए) एक ही शहर का नाम कई बार वापस आ जाएगी है, और मैं केवल शहर में प्रति CityDTO का एक उदाहरण चाहते हैं।

क्या यह दो LINQ स्टेटमेंट के साथ किया गया है? शहरों की एक नई सूची पाने के लिए, और दूसरा प्रत्येक के लिए ट्रेन स्टेशनों की सूची प्राप्त करने के लिए?

(from city in cities 
select new CityDTO 
    { 
    CityName = city.Name, 
    StateName = city.State, 
    Trainstations = city.TrainStations.Select(ts => ts.Name).ToList() 
    }) 
ऊपर

Select() को परियोजना उपयोग कर रहा है: क्योंकि वहाँ एक नेविगेशन-संपत्ति City से TrainStations तो एफई के लिए स्वचालित रूप से आप के लिए स्टेशनों को पुनः प्राप्त करने में सक्षम हो जाएगा है

उत्तर

2

Join आपरेशन यहाँ निहित है Name संपत्ति के आधार पर string की सूची में ट्रेन स्टेशनों की सूची।

MSDN

+0

भयानक। धन्यवाद – Duanne

3

@ haim770, आपका जवाब सही रास्ते पर मुझे मदद मिली देखें। ब्याज की बात के रूप में, मुझे दो और चीजों को बदलना पड़ा।

जब मैं सिर्फ प्रोजेक्टर का चयन करें जोड़ने के लिए, मैं निम्नलिखित रन टाइम त्रुटि मिलती है

enter image description here

तो चयन का अनुमान प्रकार IEnumerable होने की उम्मीद है, इसलिए मैं इस किया जा सकता है और सभी शांत होगा :

public class CityDTO 
{ 
    public string CityName { get; set; } 
    public string StateName { get; set; } 
    public IEnumerable<string> Trainstations { get; set; } //changed from List<> to IEnumerable<> 
} 

अब इस ठीक काम करता है:

public List<CityDTO> GetCities() 
    { 
     using (var db = new CitysDataEntities()) 
     { 
      var cities = db.Cities; 

      var query = 
      (from city in cities 
      select new CityDTO 
       { 
        CityName = city.Name, 
        Trainstations = city.TrainStations.Select(ts => ts.Name) //now this works 

       }).ToList(); 

      return query; 
     } 
    } 

हालांकि, कुछ और पढ़ने के बाद, मैंने IQueryable का उपयोग करने का निर्णय लिया जिसमें एक चयन विधि भी है।

इसका कारण यह है कि IQueryable.Select System.Linq के अंतर्गत है, जबकि IENumerable.Select सिस्टम में है। चयन नामस्थान। IQueryable के रूप में यह महत्वपूर्ण है। सर्वर पर सभी फ़िल्टर के साथ निष्पादित करने के लिए ऑप्टिमाइज़ किया गया है और केवल परिणाम को क्लाइंट को वापस लौटाएं, जबकि IENumerable। फ़िल्टर करने से पहले ऑब्जेक्ट को क्लाइंट पहले पर लोड करें।

IEnumerable Vs IQueryable

तो परिणाम यह

public class CityDTO 
{ 
    public string CityName { get; set; } 
    public string StateName { get; set; } 
    public IQueryable<string> Trainstations { get; set; } // changed to IQueryable 
} 

और

public List<CityDTO> GetCities() 
    { 
     using (var db = new CitysDataEntities()) 
     { 
      var cities = db.Cities; 

      var query = 
      (from city in cities 
      select new CityDTO 
       { 
        CityName = city.Name, 
        Trainstations = city.TrainStations.Select(ts => ts.Name).AsQueryable() // return AsQueryable 

       }).ToList(); 

      return query; 
     } 
    } 

अब जब मैं फ़िल्टर जोड़ें वे लागू किया जाएगा सर्वर साइड है।

MSDN - Queryable.Select

MSDN - Enumerable.Select

0

उपयोग AutoMapper IList को संग्रह संपत्ति परियोजना के लिए।

Queryable.ProjectTo<UserListDto>().ToArray(); 

इकाई

public class User 
{ 
    public string Name { get; set; } 

    public virtual ICollection<UserRole> Roles { get; set; } 
} 

Dto

[AutoMapFrom(typeof(User))] 
public class UserListDto 
{ 
    public string Name { get; set; } 

    public IList<UserRoleOutput> Roles { get; set; } 

    [AutoMapFrom(typeof(UserRole))] 
    public class UserRoleOutput 
    { 
     public int RoleId { get; set; } 
    } 
} 
संबंधित मुद्दे