2016-02-10 4 views
6

पर foreach मैं तीन तालिकाओं में शामिल होने के लिए इकाई फ्रेमवर्क के साथ LINQ का उपयोग कर रहा हूं और मैं IList इंटरफ़ेस लौटा रहा हूं।आईनेमेरेबल या IList

मैं इस वापसी मूल्य पर foreach लूप लागू करना चाहता हूं ताकि मैं अपने मॉडल में मूल्यों को पॉप्युलेट कर सकूं।

public IList GetData(long Id) 
{ 
    //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
    var query = from u in dataContext.tblUsers 
    join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
    join c in dataContext.tblComments on u.Id equals c.Commentedby 

    where c.Id == Id 
    select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 

    return query.ToList(); 
} 

मैं अपने मॉडल की सूची में इन मूल्यों को भरने के लिए चाहते हैं:

यह मैं कैसे शामिल होने के कर रहा हूँ। मैं इस की कोशिश की है:

var lst = repository.GetDate(Id); 
foreach (var item in lst) 
{ 

} 

लेकिन मैं आइटम तक पहुंचने में असमर्थ हूँ Firstname/Lastname आदि

मैं भी वस्तु item और object[] item उपयोग करने की कोशिश, लेकिन वे दोनों भी काम नहीं कर रहे।

मैं for प्रत्येक on IList` कैसे लागू कर सकता हूं?

यह ठीक काम करेगा अगर मैं इस मामले में IList के बजाय DataTable वापस करने में सक्षम हूं।

उत्तर

7

आपका एक गुमनाम प्रकार बना रहे हैं। इस तरह

public IList<YourClassName> GetData(long Id) 
{ 

} 

सेट वर्ग मान:: बस आपकी क्वेरी के परिणाम के लिए एक वर्ग को परिभाषित, तो अपने समारोह की वापसी प्रकार इस तरह होना चाहिए

select new YourClassName 
{ 
    Firstname = u.Firstname, 
    Lastname = u.Lastname, 
    ProfilePicPath = p.ProfilePicPath, 
    Comment = c.Comment, 
    CommentDate = c.CommentDate 
}; 
1

आपको गुमनाम प्रकार पैदा कर रहे:

select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 

आप आदि अन्य तरीकों के लिए इस डेटा पास करना चाहते हैं आप एक असली वर्ग बनाना होगा।

public class DataClass 
{ 
    public string Firstname { get; set; } 
    public string LastName{ get; set; } 
    public string ProfilePicPath { get; set; } 
    public string Comment { get; set; } 
    public DateTime CommentDate { get; set; } 
} 

और इसका इस्तेमाल करते हैं:

public IList<DataClass> GetData(long Id) 
{ 
    var query = from u in dataContext.tblUsers 
       join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
       join c in dataContext.tblComments on u.Id equals c.Commentedby 
       where c.Id == Id 
    select new DataClass 
    { 
     Firstname = u.Firstname, 
     Lastname = u.Lastname, 
     ProfilePicPath = p.ProfilePicPath, 
     Comment = c.Comment, 
     CommentDate = c.CommentDate 
    }; 

    return query.ToList(); 
} 
0

आपको गुमनाम का उपयोग कर रहे इसलिए आप अपनी सूची के माध्यम से लूप करते समय इसे किसी भी चीज़ पर नहीं डाल सकते हैं। परिणाम आइटम के लिए एक वर्ग को परिभाषित करने की तरह अन्य उत्तर सुझाव दे रहे हैं

foreach (dynamic item in lst) 
{ 
    string firstName = item.FirstName; 
} 

या स्पष्ट रूप से: आप dynamicvar के बजाय जिसका मतलब है कि आप क्रम में जब तक यह मौजूद है उस पर किसी भी संपत्ति कॉल कर सकते हैं का उपयोग कर की कोशिश कर सकते।

0

आपको गेटडाटा वापसी प्रकार बदलना होगा। कृपया इसे आजमाएं:

public List<tblUsers> GetData(long Id) 
     { 
      //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
      var query = from u in dataContext.tblUsers 
         join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
         join c in dataContext.tblComments on u.Id equals c.Commentedby 
         where c.Id == Id 
         select new tblUsers { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 
      return query.ToList(); 
     } 
1

आपको केवल IList इंटरफ़ेस नहीं बल्कि आपके प्रकार के साथ पैरामीरेटेड इंटरफ़ेस वापस करना चाहिए। अब आप anounymouse ऑब्जेक्ट को पुन: प्रस्तुत करते हैं।

तो मैं क्या सुझाव देना चाहता हूं।इस तरह

public class MyCustomContainer 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public string ProfilePicPath { get; set; } 
    public string Comment { get; set; } 
    public string CommentDate { get; set; } 
} 

और यह परिवर्तन आपके विधि:

public IList<MyCustomContainer> GetData(long Id) 
     { 
      //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
      var query = from u in dataContext.tblUsers 
         join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
         join c in dataContext.tblComments on u.Id equals c.Commentedby 
         where c.Id == Id 
         select new MyCustomContainer 
         { 
          Firstname = u.Firstname, 
          Lastname = u.Lastname, 
          ProfilePicPath = p.ProfilePicPath, 
          Comment = c.Comment, 
          CommentDate = c.CommentDate 
          }; 
      return query.ToList(); 
     } 

अब आप सूची के भीतर वस्तु anonymouse नहीं तो आप सभी गुण आप

4

आप वापस लौट रहे हैं की जरूरत है प्राप्त कर सकते हैं लौटने इस वर्ग बनाएं विधि में objects के anonymous सूची। आप प्रतिबिंब का उपयोग करके गुणों का उपयोग कर सकते हैं लेकिन रनटाइम पर यह धीमा है। प्रकार की जानकारी प्राप्त करना सबसे आसान है कक्षा को परिभाषित करना और select कथन में इसका उपयोग करना।

public class Person 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    /* ... */ 
} 

public IList<Person> GetData(long Id) 
{ 
    var query = from u in dataContext.tblUsers 
       join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
       join c in dataContext.tblComments on u.Id equals c.Commentedby 
       where c.Id == Id 
       select new Person { u.Firstname, u.Lastname /* ... */ }; 
     return query.ToList(); 
} 
संबंधित मुद्दे