2012-02-16 14 views
5

लक्ष्य:जेनेरिक निर्यात

हमारे आवेदन कई प्रकार का उपयोग कर बनाया गया है (उदाहरण के लिए व्यक्ति, PersonSite (ICollection), साइट - मैं उन कक्षाओं का चयन किया है क्योंकि वे एक रिश्ता है)। हम जो करना चाहते हैं वह एक्सेल टेबल में पहले प्रकार (व्यक्ति) से कुछ गुणों को निर्यात करने में सक्षम होना है और फिर उसी एक्सेल फ़ाइल के अंदर दूसरे प्रकार (पर्सनसाइट) से कुछ अन्य गुणों को निर्यात करना है, लेकिन उसी पर एक नई तालिका में चादर।

परिणाम इस तरह दिखना चाहिए:

 
_________________ ________________________ ________________ 
|     | |      | |    | 
|PERSON PROPERTIES| | PERSONSITE PROPERTIES | |SITE PROPERTIES | 
|_________________| |________________________| |________________| 
| Name Person 1 | |Relation type for item 1| | Name for item 1| 
|_________________| |________________________| |________________| 
        |Relation type for item 2| | Name for item 2| 
        |________________________| |________________| 
        |Relation type for item 3| | Name for item 3| 
        |________________________| |________________| 
_________________ ________________________ ________________ 
| Name Person 2 | |Relation type for item 1| | Name for item 1| 
|_________________| |________________________| |________________| 
        |Relation type for item 2| | Name for item 1| 
        |________________________| |________________| 

तो सूची में शामिल हर PersonSite के लिए, हम एक मेज कि सिर्फ व्यक्ति की मेज के बाद सम्मिलित किया जाएगा बनाने के लिए करना चाहते हैं।

public class Person : IObject 
{ 
    public ICollection<PersonSite> PersonSites {get;set;} 
} 

अब PersonSite वर्ग (सबसेट):

public class PersonSite : IObject 
{ 
    public Person Person {get;set;} 
    public Site Site {get;set;} 
    public RelationType RelationType {get;set;} 
} 

साइट वर्ग (सबसेट):

तो यह कैसे दिखते व्यक्ति वर्ग (कक्षा के सबसेट) है

public class Site : IObject 
{ 
    public ICollection<PersonSite> PersonSites {get;set;} 
} 

तो हमने एक CSVExporter वर्ग लिखने का निर्णय लिया जो गुणों को पुनर्प्राप्त करने के लिए अभिव्यक्तियों का उपयोग करने के लिए उपयोग करता है निर्यात किया।

      
          ____ 
          | |0..* 
______________   __|____|______  1..* _______________ 
| CSV EXPORTER |________| CSV TABLE (T)|__________| CSV COLUMN (T)| 
|______________|  |______________|   |_______________| 
           | 
           |1..* 
         ______|________ 
         | CSV ROWS (T) | 
         |_______________| 

तो CSVTable एक सामान्य प्रकार IObject है कि (के रूप में विभिन्न वर्गों में प्रयुक्त) का उपयोग करें:

यह योजना है कि हम इस को लागू करना है।

एक तालिका में एकाधिक तालिका हो सकती है (उदा। व्यक्ति तालिका में एक व्यक्तिसाइट तालिका है और एक व्यक्तिसाइट तालिका में एक साइट तालिका है)। लेकिन इस्तेमाल किया जाने वाला प्रकार अलग है क्योंकि हम विभिन्न वर्गों (उन वर्गों के साथ संबंध होना चाहिए) के माध्यम से नेविगेट करते हैं।

जब एक मेज हम एन अभिव्यक्ति है कि मुख्य मदों से सही प्रकार की वस्तुओं (व्यक्ति => Person.PersonSite) हड़पने जाएगा प्रदान करना चाहिए

तो हम के लिए कोड का निम्न भाग लिखा करने के लिए एक subtable जोड़ने तालिका:

public class CSVExportTableColumn<T> where T : IObject 
{ 
    public Expression<Func<T, object>> ExportProperty { get; set; } 

    public CSVExportTableColumn(Expression<Func<T, object>> exportProperty) 
    { 
     this.ExportProperty = exportProperty; 
    } 
} 

क्या कभी किसी ने ऐसा ही कुछ किया गया है:

public class CSVExportTable<T> 
    where T : IObject 
{ 

    private Matrix<string> Matrix { get; set; } 
    private ICollection<CSVExportTableColumn<T>> Columns { get; set; } 
    private ICollection<CSVExportTableRow<T>> Rows { get; set; } 
    private ICollection<CSVExportTable<IObject>> SubTables { get; set; } 
    private Expression<Func<T, object>> Link { get; set; } 


    public CSVExportTable() 
    { 
     this.Matrix = new Matrix<string>(); 
     this.Columns = new List<CSVExportTableColumn<T>>(); 
     this.SubTables = new List<CSVExportTable<IObject>>(); 
     this.Rows = new List<CSVExportTableRow<T>>(); 
    } 

    public CSVExportTable<R> AddSubTable<R>(Expression<Func<T, object>> link) where R : IObject 
    { 
     /* This is where we create the link between the main table items and the subtable items (= where we retreive Person => Person.PersonSites as an ICollection<R> since the subtable has a different type (T != R but they have the same interface(IObject))*/ 
    } 

    public void AddColumn(Expression<Func<T, object>> exportProperty) 
    { 
     this.Columns.Add(new CSVExportTableColumn<T>(exportProperty)); 
    } 

    public Matrix<string> GenerateMatrix() 
    { 
     int rowIndex= 0; 
     foreach (CSVExportTableRow<T> row in this.Rows) 
     { 
      int columnIndex = 0; 
      foreach (CSVExportTableColumn<T> column in this.Columns) 
      { 
       this.Matrix = this.Matrix.AddValue(rowIndex, columnIndex, ((string)column.ExportProperty.Compile().DynamicInvoke(row.Item))); 
       columnIndex++; 
      } 
      rowIndex++; 
     } 
     return this.Matrix; 
    } 

    public Matrix<string> ApplyTemplate(ICollection<T> items) 
    { 
     // Generate rows 
     foreach (T item in items) 
     { 
      this.Rows.Add(new CSVExportTableRow<T>(item)); 
     } 
     // Instantiate the matrix 
     Matrix<string> matrix = new Matrix<string>(); 

     // Generate matrix for every row 
     foreach (var row in this.Rows) 
     { 
      matrix = GenerateMatrix(); 
      // Generate matrix for every sub table 
      foreach (var subTable in this.SubTables) 
      { 
       // This it where we should call ApplyTemplate for the current subTable with the elements that the link expression gave us(ICollection). 
      } 
     } 
     return matrix; 
    } 
} 

और अंत में यहाँ CSVExportTableColumn वर्ग है? या क्या हम गलत रास्ते पर जा रहे हैं? यदि यह एक अच्छा मार्ग प्रतीत होता है, तो हम लिंक (रिश्ते) अभिव्यक्ति कैसे बना सकते हैं और अंतिम कॉल पर उपयोग करने के लिए सही आइटम पुनर्प्राप्त करने के लिए इसका उपयोग कैसे कर सकते हैं?

public Matrix<string> ApplyTemplate(object items) 
    { 
     ICollection<T> castedItems = new List<T>(); 
     // Cast items as a List<T> 
     if (items is List<T>) 
     { 
      castedItems = (ICollection<T>)items; 
     } 
     else if (items is HashSet<T>) 
     { 
      castedItems = ((HashSet<T>)items).ToList(); 
     } 
     // Generate rows 
     foreach (T item in castedItems) 
     { 
      this.Rows.Add(new CSVExportTableRow<T>(item)); 
     } 
     // Instantiate the matrix 
     Matrix<string> matrix = new Matrix<string>(); 

     // Generate matrix for every row 
     foreach (var row in this.Rows) 
     { 
      matrix = GenerateMatrix(); 
      // Generate matrix for every sub table 
      foreach (var subTable in this.SubTables) 
      { 
       matrix = matrix.AddMatrix(subTable.ApplyTemplate(this.Link.Compile().DynamicInvoke(row.Item))); 
      } 
     } 
     return matrix; 
    } 

यह किसी भी उप तालिका के लिए टेम्पलेट लागू होंगे:

+1

बढ़िया आप इसे काम कर सकते हैं क्या आप इसे बंद कर सकते हैं? –

+4

मैं @MicahArmantrout से सहमत हूं; दूसरों के लिए समान समस्याओं की खोज करने के लिए, क्या आप अपना अपडेट उत्तर के रूप में पोस्ट कर सकते हैं और इसे स्वीकार कर सकते हैं? यह आपके प्रश्न को हल करने का प्रयास करने से उत्तर देने वालों को भी रोक देगा .. धन्यवाद :-) – Jonno

+2

@ वाहमी कृपया अपना समाधान उत्तर के रूप में पोस्ट करें। आप उस उत्तर को स्वीकार कर सकते हैं (कभी-कभी आपको ऐसा करने के लिए एक दिन या 2 का इंतजार करना पड़ता है)। यदि आप कुछ बेहतरीन काम करते हैं, तो आप अपने प्रश्न और उत्तर दोनों को ऊपर उठाएंगे। अब परिष्करण चरण ( –

उत्तर

0
देरी के लिए

क्षमा करें,

तो अंत में, हम इसे इस तरह से काम कर रहा मिला है।

आशा है कि यह दूसरों के लिए उपयोगी हो सकता है।

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