<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: LINQ, Collection of interfaces και performance</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/53591.aspx</link><pubDate>Thu, 10 Sep 2009 02:58:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:53591</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/53591.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=53591</wfw:commentRss><description>&lt;P&gt;Τσκ, τσκ, τσκ! Δεν είπες από την αρχή ότι έψαχνες να βρεις ποιά αντικείμενα έχουν κοινά ονόματα! Βλέποντας τον αρχικό κώδικα δεν πήρα χαμπάρι ότι αυτό έψαχνες.&lt;/P&gt;
&lt;P&gt;Όσον αφορά τους μυστήριους χρόνους, πάω στοίχημα ότι φταίνε τα casts που δεν είναι casts. Οι κλάσεις που χρησιμοποιείς είναι COM και έτσι κάθε cast στην ουσία μετατρέπεται σε ένα QueryInterface, το οποίο μετά θέλει φυσικά και ένα Release. Πάω στοίχημα ότι ο κώδικας που δημιουργεί η πρώτη έκδοση με LINQ κάνει συνεχώς casts και Release με αποτέλεσμα την τραγική αυτή επίδοση. Το περίεργο είναι ότι η έκδοση με το Join είναι γρηγορότερη από την πρώτη εκδοχή καθώς λογικά πρέπει να δημιουργεί τον ίδιο αριθμό COM κλήσεων, αν και δεν έψαξα πολύ τον κώδικα. &lt;/P&gt;
&lt;P&gt;Γενικώς το Join είναι σκέτο λουκούμι όταν ψάχνεις να βρεις είτε κοινά αντικείμενα σε λίστες, είτε τη διαφορά. Άσε που ο κώδικας είναι απείρος καθαρότερος. Έχω χρησιμοποιήσει αυτό το κόλπο με το LINQ to Sharepoint. Εκεί βέβαια δεν υποστηρίζεται το Join, οπότε έκανα το εξής: Πήρα τα ονόματα των αντικειμένων με δύο LINQ queries και μετά κράτησα το Minus τους. Έτσι βρήκα τις διαφορές. Δεν αποκλείεται να κάνει κάτι τέτοιο και το LINQ to Objects για να αποφύγει να κάνει M*N αναζητήσεις.&lt;/P&gt;</description></item><item><title>Απ: LINQ, Collection of interfaces και performance</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/53590.aspx</link><pubDate>Thu, 10 Sep 2009 02:45:03 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:53590</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/53590.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=53590</wfw:commentRss><description>&lt;P&gt;Ωραία! Η απάντηση στο παραπάνω είναι... Κανέναν!&lt;/P&gt;
&lt;P&gt;JOIN&amp;nbsp;to the rescue!&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; externalColumns &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; destinationInput.ExternalMetadataColumnCollection.Cast(Of IDTSExternalMetadataColumn100)()
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; inputColumns &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; destinationVirtualInputColumns.Cast(Of IDTSVirtualInputColumn100)()

        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; query &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; From externalColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; externalColumns _
                    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Join&lt;/SPAN&gt; virtualInputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; inputColumns &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;On&lt;/SPAN&gt; externalColumn.Name Equals virtualInputColumn.Name _
                    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Select&lt;/SPAN&gt; externalColumn, virtualInputColumn

        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Each&lt;/SPAN&gt; element &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; query
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; inputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSInputColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; sqlServerDestInstance.SetUsageType(destinationInput.ID, destinationVirtualInput, element.virtualInputColumn.LineageID, DTSUsageType.UT_READONLY)
            sqlServerDestInstance.MapInputColumn(destinationInput.ID, inputColumn.ID, element.externalColumn.ID)
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;H αλήθεια είναι ότι δεν πήγε κατευθείαν εκεί το μυαλό μου - δεν έχω συνηθίσει να σκέφτομαι the linq way... &lt;/P&gt;
&lt;P&gt;Χρόνος; Ταρατατζούμ... 00 min &amp;amp; 01.23 sec. Niiiceee...&lt;/P&gt;</description></item><item><title>LINQ, Collection of interfaces και performance</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/53589.aspx</link><pubDate>Thu, 10 Sep 2009 02:18:43 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:53589</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/53589.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=53589</wfw:commentRss><description>&lt;P&gt;Αυτές τις μέρες γράφω κώδικα που έχει να κάνει με την προγραμματιστική δημιουργία ενός πακέτου για τα Integration Services του&amp;nbsp;SQL Server&amp;nbsp;και μου έτυχε το εξής ενδιαφέρον πρόβλημα (έτσι κουβέντα να γίνεται):&lt;/P&gt;
&lt;P&gt;Ας ξεκινήσουμε με την πρώτη έκδοση του κώδικα την οποία δοκίμασα αρχικά:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Select and map destination columns&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Each&lt;/SPAN&gt; virtualInputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSVirtualInputColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; destinationVirtualInputColumns
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Select column, and retain new input column&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; inputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSInputColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; sqlServerDestInstance.SetUsageType(destinationInput.ID, destinationVirtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY)
            
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Find external column&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; externalColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSExternalMetadataColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Nothing&lt;/SPAN&gt;

            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Each&lt;/SPAN&gt; di &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSExternalMetadataColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; destinationInput.ExternalMetadataColumnCollection
                &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; di.Name &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; inputColumn.Name &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
                    externalColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; di
                    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Exit&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt;
                &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;

            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Map input column to external column&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; externalColumn IsNot &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Nothing&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
                Debug.WriteLine(externalColumn.Name)
                sqlServerDestInstance.MapInputColumn(destinationInput.ID, inputColumn.ID, externalColumn.ID)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Else&lt;/SPAN&gt;
                Debug.WriteLine(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Not found: "&lt;/SPAN&gt; &amp;amp; virtualInputColumn.Name)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt; virtualInputColumn&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Μην τρομάξετε και σας χάσω, ο κώδικας είναι απλός. Έχουμε μια σειρά από input columns και θέλουμε να τα κάνουμε map σε output columns. Μέσα στα input columns είναι πολλά που δεν μας κάνουν&amp;nbsp;οπότε η λογική πάει&amp;nbsp;ως εξής. Έχουμε δύο collections, το destinationVirtualInputColumns&amp;nbsp;και το ExternalMetadataColumnCollection. Παίρνουμε&amp;nbsp;ένα-ένα τα input columns και ψάχνουμε αν υπάρχουν στο ExternalMetadataColumnCollection ώστε&amp;nbsp;στη συνέχεια να κάνουμε MapInputColumn.&amp;nbsp;Το ExternalMetadataColumnCollection είναι ένα χαζό-collection από&amp;nbsp;interfaces&amp;nbsp;IDTSExternalMetadataColumn100, μιλάμε για COM&amp;nbsp;και δεν έχει εξυπνάδες τύπου "Contains".&amp;nbsp;Έχει όμως μια εξυπνάδα που&amp;nbsp;τη χρησιμοποίησα για να κάνω τη δεύτερη έκδοση του snippet:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Select and map destination columns&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Each&lt;/SPAN&gt; virtualInputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSVirtualInputColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; destinationVirtualInputColumns
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Select column, and retain new input column&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; inputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSInputColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; sqlServerDestInstance.SetUsageType(destinationInput.ID, destinationVirtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Find external column by name&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; externalColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSExternalMetadataColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Nothing&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/SPAN&gt;
                externalColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; destinationInput.ExternalMetadataColumnCollection(inputColumn.Name)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; System.Runtime.InteropServices.COMException
                &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;'Bummer! Column not found...&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/SPAN&gt;

            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Map input column to external column&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; externalColumn IsNot &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Nothing&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
                Debug.WriteLine(externalColumn.Name)
                sqlServerDestInstance.MapInputColumn(destinationInput.ID, inputColumn.ID, externalColumn.ID)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Else&lt;/SPAN&gt;
                Debug.WriteLine(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Not found: "&lt;/SPAN&gt; &amp;amp; virtualInputColumn.Name)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt; virtualInputColumn&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Προσέξτε το Try/Catch. Μπορώ να πάρω reference χρησιμοποιώντας το Item default property ωστόσο αν δεν υπάρχει αυτό που ψάχνω έχω exception. Δεν μπορώ να πω ότι με ενθουσιάζει προγραμματιστικά αυτός ο τρόπος, οπότε είπα να δοκιμάσω και με LINQ, περισσότερο από περιέργεια καθώς ήξερα ότι από πλευράς performance δεν θα γούρλωνα τα μάτια:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; externalColumns &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; destinationInput.ExternalMetadataColumnCollection.Cast(Of IDTSExternalMetadataColumn100)()
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Select and map destination columns&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Each&lt;/SPAN&gt; virtualInputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSVirtualInputColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; destinationVirtualInputColumns
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Select column, and retain new input column&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; inputColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; IDTSInputColumn100 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; sqlServerDestInstance.SetUsageType(destinationInput.ID, destinationVirtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY)

            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Find external column by name&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; externalColumn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; externalColumns _
                                 .SingleOrDefault(&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Function&lt;/SPAN&gt;(c) c.Name &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; inputColumn.Name)

            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;' Map input column to external column&lt;/SPAN&gt;
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; externalColumn IsNot &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Nothing&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
                Debug.WriteLine(externalColumn.Name)
                sqlServerDestInstance.MapInputColumn(destinationInput.ID, inputColumn.ID, externalColumn.ID)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Else&lt;/SPAN&gt;
                Debug.WriteLine(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Not found: "&lt;/SPAN&gt; &amp;amp; virtualInputColumn.Name)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt; virtualInputColumn&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Πιο κομψός κώδικας σε σχέση με τις δύο προηγούμενες δοκιμές.&amp;nbsp;Κράτησα για το τέλος το θέμα του performance. Με ένα stopwatch&amp;nbsp;μέτρησα και βρήκα τα παρακάτω:&lt;/P&gt;
&lt;P&gt;1η έκδοση: &amp;nbsp;01 min και 05.87 sec&lt;BR&gt;2η έκδοση:&amp;nbsp; 00 min και 03.48 sec&lt;BR&gt;3η έκδοση:&amp;nbsp; 01 min και 37.79 sec&lt;/P&gt;
&lt;P&gt;Ουφ! Φτάσαμε στο τέλος. Το ερώτημα είναι... &lt;STRIKE&gt;πώς λένε τον οδηγό;&lt;/STRIKE&gt;&amp;nbsp;Χα, όχι. &lt;STRONG&gt;Ποιόν κώδικα κρατάς και γιατί;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item></channel></rss>