<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>Slinq - Streaming LINQ</title><link>http://slinq.codeplex.com/project/feeds/rss</link><description>An implementation of LINQ focused on streaming data.</description><item><title>Source code checked in, #69709</title><link>http://slinq.codeplex.com/SourceControl/changeset/changes/69709</link><description>Upgrade&amp;#58; New Version of LabDefaultTemplate.xaml. To upgrade your build definitions, please visit the following link&amp;#58; http&amp;#58;&amp;#47;&amp;#47;go.microsoft.com&amp;#47;fwlink&amp;#47;&amp;#63;LinkId&amp;#61;254563</description><author>Project Collection Service Accounts</author><pubDate>Mon, 01 Oct 2012 22:10:56 GMT</pubDate><guid isPermaLink="false">Source code checked in, #69709 20121001101056P</guid></item><item><title>Source code checked in, #69708</title><link>http://slinq.codeplex.com/SourceControl/changeset/changes/69708</link><description>Checked in by server upgrade</description><author>Project Collection Service Accounts</author><pubDate>Mon, 01 Oct 2012 22:06:45 GMT</pubDate><guid isPermaLink="false">Source code checked in, #69708 20121001100645P</guid></item><item><title>Created Issue: Integrating with WCF [21976]</title><link>http://slinq.codeplex.com/workitem/21976</link><description>I am finding it very difficult to integrate with WCF. Can you please help me on this.&lt;br /&gt;</description><author>anup1252000</author><pubDate>Tue, 27 Dec 2011 04:36:52 GMT</pubDate><guid isPermaLink="false">Created Issue: Integrating with WCF [21976] 20111227043652A</guid></item><item><title>Source code checked in, #52373</title><link>http://slinq.codeplex.com/SourceControl/changeset/changes/52373</link><description>Checked in by server upgrade</description><author>_TFSSERVICE</author><pubDate>Wed, 28 Jul 2010 17:08:20 GMT</pubDate><guid isPermaLink="false">Source code checked in, #52373 20100728050820P</guid></item><item><title>New Post: Where do you get your streaming stock data?</title><link>http://slinq.codeplex.com/Thread/View.aspx?ThreadId=69490</link><description>&lt;div style="line-height: normal;"&gt;&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;This looks like something I would like to do also! Are you still actively working on the technique?&lt;/p&gt;&lt;/div&gt;</description><author>bstabile</author><pubDate>Sun, 27 Sep 2009 06:41:09 GMT</pubDate><guid isPermaLink="false">New Post: Where do you get your streaming stock data? 20090927064109A</guid></item><item><title>New Post: Where do you get your streaming stock data?</title><link>http://slinq.codeplex.com/Thread/View.aspx?ThreadId=69490</link><description>&lt;div style="line-height: normal;"&gt;&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This looks like something I would like to do.&amp;nbsp; I definitely will have to check this out.&amp;nbsp; But I am curious as to where do you get your streaming stock quotes from?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;&lt;/div&gt;</description><author>ashlar64</author><pubDate>Sat, 19 Sep 2009 21:06:14 GMT</pubDate><guid isPermaLink="false">New Post: Where do you get your streaming stock data? 20090919090614P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/Slinq/Wiki/View.aspx?title=Home&amp;version=19</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;An implementation of LINQ focused on streaming data.
&lt;br /&gt; &lt;br /&gt;Slinq is a set of extension methods that implement the LINQ pattern geared for constantly changing data.  Examples include sensor networks, network monitors, financial services or any other push-based systems where the client needs to display or take action on &amp;quot;live&amp;quot; data.&lt;br /&gt; &lt;br /&gt;I've uploaded an initial prototype that demonstrates the idea; a lot more work is required to implement the various LINQ methods.  Please contact me with patches if you're interested in contributing.   If you have any suggestions/comments/feedback, please post in the discussion forum.  &lt;br /&gt; &lt;br /&gt;To build/run the source, you'll need Visual Studio 2008.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Design Overview
&lt;/h2&gt;The test harness contains code that would normally be split among a data layer and client layer.  The MarketDataService simulates (poorly) a stream of constantly changing market data.  It runs on its own thread (a background timer) and updates the data values.  In a real application, you'd have some other listener doing this based on &amp;quot;real&amp;quot; events.  The Grid is a DataGridView in VirtualMode; there's currently a throttle (a winforms Timer) that takes a current snapshot of the query every &lt;i&gt;n&lt;/i&gt;-milliseconds for a display cache.  This can, and should, be further optimized in a real application. &lt;br /&gt; &lt;br /&gt;One important thing to note is that despite the polling for snapshots, the entire query itself is &lt;i&gt;not&lt;/i&gt; being re-run each time.  The grid timer simply takes a read-lock on the stream, copies the current data into a display cache that the UI can use w/o locks and releases the lock on the query.  The only time the query is currently being re-run is when the &amp;quot;toggle&amp;quot; button is pressed.  That could be further enhanced to change the where clause w/o re-assembling the query.  Another important note is that while references to the data elements are being copied in a few places, the underlying data itself is in memory only once.  That is, if you have two queries against any given source, the data content is in the source once.  Only the references are moving through the query stream.&lt;br /&gt; &lt;br /&gt;When looking at the code, the real/interesting code is in the Slinq library in the StreamAdapter and SynchronizedBindingCollection classes.  The collection classes generate events that the StreamAdapters listen for and propagate as needed.  So unlike the built-in IEnumerable-based implementation where the iterators are forward-only, this implementation will respond to changing items in the source collection.  &lt;br /&gt; &lt;br /&gt;The other area of potential interest is the data model.  In order to be able to join multiple pieces of data and not lose any of the data, a containment system is used.  Data is stored and accessed via Schema's that define fields on the data.  Multiple pieces of content can be put into a ContentSet and still be accessed directly by the schema's accessors.  In this way, we can put both order data along with its joined market data into a single ContentSet.  Market data is extracted using the market data schema field accessors and order data using an order schema field accessor.  A future grid implementation could determine the set of schemas and available fields at the result of the query and generate the appropriate columns.  Calculated columns could also be added by an adapter -- it could use a calculated schema to store a piece of calculated content within the ContentSet.  The grid would read and display it seamlessly.  &lt;br /&gt; &lt;br /&gt;Note that the data model is not required in order to use Slinq, but it's an option.  The only real requirement is that your type implement IEquatable in terms of some key value per record.  This is important since records should be immutable.  Nothing enforces this, but an immutable data type eliminates threading issues around partial reads and inconstant data.  A future release might allow a key function to be specified instead of using IEquatable, but that's TBD.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Demo
&lt;/h2&gt;Below is a screen cast of the test harness.  Pressing the &amp;quot;Populate 50&amp;quot; button adds 50 random data elements.  Clicking &amp;quot;Toggle Ask/Bid&amp;quot; changes the sort order to either the Bid or Ask column.  In the case of Bid, it does a descending and for Ask it's ascending.  While the example is a bit contrived, as you generally wouldn't query in this way, it proves that it works.  &lt;br /&gt; &lt;br /&gt;I apologize for the quality of the video; CodePlex doesn't allow you to embed a movie/flash document with the correct size, so it's an animated GIF instead.  The real application is far more responsive and smooth than the video.  &lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=Slinq&amp;amp;DownloadId=13424" alt="slinq.gif" /&gt;&lt;br /&gt; &lt;br /&gt;If you have any questions, please post them!&lt;br /&gt;Thanks,&lt;br /&gt;Oren Novotny&lt;br /&gt;
&lt;/div&gt;</description><author>onovotny</author><pubDate>Sun, 22 Jun 2008 14:13:30 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20080622021330P</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/Slinq/Wiki/View.aspx?title=Home&amp;version=18</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;An implementation of LINQ focused on streaming data.
&lt;br /&gt; &lt;br /&gt;Slinq is a set of extension methods that implement the LINQ pattern geared for constantly changing data.  Examples include sensor networks, network monitors, financial services or any other push-based systems where the client needs to display or take action on &amp;quot;live&amp;quot; data.&lt;br /&gt; &lt;br /&gt;I've uploaded an initial prototype that demonstrates the idea; a lot more work is required to implement the various LINQ methods.  Please contact me with patches if you're interested in contributing.   If you have any suggestions/comments/feedback, please post in the discussion forum.  &lt;br /&gt; &lt;br /&gt;To build/run the source, you'll need Visual Studio 2008.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Design Overview
&lt;/h2&gt;The test harness contains code that would normally be split among a data layer and client layer.  The MarketDataService simulates (poorly) a stream of constantly changing market data.  It runs on its own thread (a background timer) and updates the data values.  In a real application, you'd have some other listener doing this based on &amp;quot;real&amp;quot; events.  The Grid is a DataGridView in VirtualMode; there's currently a throttle (a winforms Timer) that takes a current snapshot of the query every &lt;i&gt;n&lt;/i&gt;-milliseconds for a display cache.  This can, and should, be further optimized in a real application. &lt;br /&gt; &lt;br /&gt;One important thing to note is that despite the polling for snapshots, the entire query itself is &lt;i&gt;not&lt;/i&gt; being re-run each time.  The grid timer simply takes a read-lock on the stream, copies the current data into a display cache that the UI can use w/o locks and releases the lock on the query.  The only time the query is currently being re-run is when the &amp;quot;toggle&amp;quot; button is pressed.  That could be further enhanced to change the where clause w/o re-assembling the query.  Another important note is that while references to the data elements are being copied in a few places, the underlying data itself is in memory only once.  That is, if you have two queries against any given source, the data content is in the source once.  Only the references are moving through the query stream.&lt;br /&gt; &lt;br /&gt;When looking at the code, the real/interesting code is in the Slinq library in the StreamAdapter and SynchronizedBindingCollection classes.  The collection classes generate events that the StreamAdapters listen for and propagate as needed.  So unlike the built-in IEnumerable-based implementation where the iterators are forward-only, this implementation will respond to changing items in the source collection.  &lt;br /&gt; &lt;br /&gt;The other area of potential interest is the data model.  In order to be able to join multiple pieces of data and not lose any of the data, a containment system is used.  Data is stored and accessed via Schema's that define fields on the data.  Multiple pieces of content can be put into a ContentSet and still be accessed directly by the schema's accessors.  In this way, we can put both order data along with its joined market data into a single ContentSet.  Market data is extracted using the market data schema field accessors and order data using an order schema field accessor.  A future grid implementation could determine the set of schemas and available fields at the result of the query and generate the appropriate columns.  Calculated columns could also be added by an adapter -- it could use a calculated schema to store a piece of calculated content within the ContentSet.  The grid would read and display it seamlessly.  &lt;br /&gt; &lt;br /&gt;Note that the data model is not required in order to use Slinq, but it's an option.  The only real requirement is that your type implement IEquatable in terms of some key value per record.  This is important since records should be immutable.  Nothing enforces this, but an immutable data type eliminates threading issues around partial reads and inconstant data.  A future release might allow a key function to be specified instead of using IEquatable, but that's TBD.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Demo
&lt;/h2&gt;Below is a screen cast of the test harness.  Pressing the &amp;quot;Populate 50&amp;quot; button adds 50 random data elements.  Clicking &amp;quot;Toggle Ask/Bid&amp;quot; changes the sort order to either the Bid or Ask column.  In the case of Bid, it does a descending and for Ask it's ascending.  While the example is a bit contrived, as you generally wouldn't query in this way, it proves that it works.  &lt;br /&gt; &lt;br /&gt;I apologize for the quality of the video; CodePlex doesn't allow you to embed a movie/flash document with the correct size, so it's an animated GIF instead.  The real application is far more responsive and smooth than the video.  &lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=Slinq&amp;amp;DownloadId=13424" alt="slinq.gif" /&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>onovotny</author><pubDate>Fri, 22 Feb 2008 03:00:13 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20080222030013A</guid></item><item><title>UPDATED RELEASE: 0.3.5 - .NET 3.5 RTM (Feb 22, 2008)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 RTM. &lt;br /&gt;&lt;br /&gt;&amp;#42; Bug fix in sorting&lt;br /&gt;&amp;#42; From .3.3, fix race condition</description><author></author><pubDate>Fri, 22 Feb 2008 02:35:50 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: 0.3.5 - .NET 3.5 RTM (Feb 22, 2008) 20080222023550A</guid></item><item><title>RELEASED: 0.3.5 - .NET 3.5 RTM (Feb 22, 2008)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 RTM. &lt;br /&gt;&lt;br /&gt;&amp;#42; Bug fix in sorting&lt;br /&gt;&amp;#42; From .3.3, fix race condition</description><author></author><pubDate>Fri, 22 Feb 2008 02:35:50 GMT</pubDate><guid isPermaLink="false">RELEASED: 0.3.5 - .NET 3.5 RTM (Feb 22, 2008) 20080222023550A</guid></item><item><title>UPDATED RELEASE: 0.3.5 - .NET 3.5 RTM (Feb 22, 2008)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 RTM. Bug fix in sorting.</description><author></author><pubDate>Fri, 22 Feb 2008 02:30:18 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: 0.3.5 - .NET 3.5 RTM (Feb 22, 2008) 20080222023018A</guid></item><item><title>UPDATED RELEASE: 0.3.5 - .NET 3.5 RTM (Feb 21, 2008)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 RTM. Bug fix in sorting.</description><author></author><pubDate>Fri, 22 Feb 2008 02:29:19 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: 0.3.5 - .NET 3.5 RTM (Feb 21, 2008) 20080222022919A</guid></item><item><title>UPDATED RELEASE: 0.3.4 - .NET 3.5 RTM (Feb 21, 2008)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 RTM.  It also contains a fix for a race condition.</description><author></author><pubDate>Fri, 22 Feb 2008 01:05:39 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: 0.3.4 - .NET 3.5 RTM (Feb 21, 2008) 20080222010539A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/Slinq/Wiki/View.aspx?title=Home&amp;version=17</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;An implementation of LINQ focused on streaming data.
&lt;br /&gt; &lt;br /&gt;Slinq is a set of extension methods that implement the LINQ pattern geared for constantly changing data.  Examples include sensor networks, network monitors, financial services or any other push-based systems where the client needs to display or take action on &amp;quot;live&amp;quot; data.&lt;br /&gt; &lt;br /&gt;I've uploaded an initial prototype that demonstrates the idea; a lot more work is required to implement the various LINQ methods.  Please contact me with patches if you're interested in contributing.   If you have any suggestions/comments/feedback, please post in the discussion forum.  &lt;br /&gt; &lt;br /&gt;To build/run the source, you'll need Visual Studio 2008.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Design Overview
&lt;/h2&gt;The test harness contains code that would normally be split among a data layer and client layer.  The MarketDataService simulates (poorly) a stream of constantly changing market data.  It runs on its own thread (a background timer) and updates the data values.  In a real application, you'd have some other listener doing this based on &amp;quot;real&amp;quot; events.  The Grid is a DataGridView in VirtualMode; there's currently a throttle (a winforms Timer) that takes a current snapshot of the query every &lt;i&gt;n&lt;/i&gt;-milliseconds for a display cache.  This can, and should, be further optimized in a real application. &lt;br /&gt; &lt;br /&gt;One important thing to note is that despite the polling for snapshots, the entire query itself is &lt;i&gt;not&lt;/i&gt; being re-run each time.  The grid timer simply takes a read-lock on the stream, copies the current data into a display cache that the UI can use w/o locks and releases the lock on the query.  The only time the query is currently being re-run is when the &amp;quot;toggle&amp;quot; button is pressed.  That could be further enhanced to change the where clause w/o re-assembling the query.  Another important note is that while references to the data elements are being copied in a few places, the underlying data itself is in memory only once.  That is, if you have two queries against any given source, the data content is in the source once.  Only the references are moving through the query stream.&lt;br /&gt; &lt;br /&gt;When looking at the code, the real/interesting code is in the Slinq library in the StreamAdapter and SynchronizedBindingCollection classes.  The collection classes generate events that the StreamAdapters listen for and propagate as needed.  So unlike the built-in IEnumerable-based implementation where the iterators are forward-only, this implementation will respond to changing items in the source collection.  &lt;br /&gt; &lt;br /&gt;The other area of potential interest is the data model.  In order to be able to join multiple pieces of data and not lose any of the data, a containment system is used.  Data is stored and accessed via Schema's that define fields on the data.  Multiple pieces of content can be put into a ContentSet and still be accessed directly by the schema's accessors.  In this way, we can put both order data along with its joined market data into a single ContentSet.  Market data is extracted using the market data schema field accessors and order data using an order schema field accessor.  A future grid implementation could determine the set of schemas and available fields at the result of the query and generate the appropriate columns.  Calculated columns could also be added by an adapter -- it could use a calculated schema to store a piece of calculated content within the ContentSet.  The grid would read and display it seamlessly.  &lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Demo
&lt;/h2&gt;Below is a screen cast of the test harness.  Pressing the &amp;quot;Populate 50&amp;quot; button adds 50 random data elements.  Clicking &amp;quot;Toggle Ask/Bid&amp;quot; changes the sort order to either the Bid or Ask column.  In the case of Bid, it does a descending and for Ask it's ascending.  While the example is a bit contrived, as you generally wouldn't query in this way, it proves that it works.  &lt;br /&gt; &lt;br /&gt;I apologize for the quality of the video; CodePlex doesn't allow you to embed a movie/flash document with the correct size, so it's an animated GIF instead.  The real application is far more responsive and smooth than the video.  &lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=Slinq&amp;amp;DownloadId=13424" alt="slinq.gif" /&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>onovotny</author><pubDate>Fri, 22 Feb 2008 00:57:15 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20080222125715A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/Slinq/Wiki/View.aspx?title=Home&amp;version=16</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;An implementation of LINQ focused on streaming data.
&lt;br /&gt; &lt;br /&gt;Slinq is a set of extension methods that implement the LINQ pattern geared for constantly changing data.  Examples include sensor networks, network monitors, financial services or any other push-based systems where the client needs to display or take action on &amp;quot;live&amp;quot; data.&lt;br /&gt; &lt;br /&gt;I've uploaded an initial prototype that demonstrates the idea; a lot more work is required to implement the various LINQ methods.  Please contact me with patches if you're interested in contributing.   If you have any suggestions/comments/feedback, please post in the discussion forum.  &lt;br /&gt; &lt;br /&gt;To build/run the source, you'll need Visual Studio 2008.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Design Overview
&lt;/h2&gt;The test harness contains code that would normally be split among a data layer and client layer.  The MarketDataService simulates (poorly) a stream of constantly changing market data.  It runs on its own thread (a background timer) and updates the data values.  In a real application, you'd have some other listener doing this based on &amp;quot;real&amp;quot; events.  The Grid is a DataGridView in VirtualMode; there's currently a throttle (a winforms Timer) that takes a current snapshot of the query every &lt;i&gt;n&lt;/i&gt;-milliseconds.  This can, and should, be further optimized in a real application. &lt;br /&gt; &lt;br /&gt;One important thing to note is that despite the polling for snapshots, the entire query itself is &lt;i&gt;not&lt;/i&gt; being re-run each time.  The grid timer simply takes a read-lock on the stream, copies the current data into a buffer and releases the lock.  The only time the query is currently being re-run is when the &amp;quot;toggle&amp;quot; button is pressed.  That could be further enhanced to change the where clause w/o re-assembling the query.  Another important note is that while references to the data elements are being copied in a few places, the underlying data itself is in memory only once.  That is, if you have two queries against any given source, the data content is in the source once.  Only the references are moving through the query stream.&lt;br /&gt; &lt;br /&gt;When looking at the code, the real/interesting code is in the Slinq library in the StreamAdapter and SynchronizedBindingCollection classes.  The collection classes generate events that the StreamAdapters listen for and propagate as needed.  So unlike the built-in IEnumerable-based implementation where the iterators are forward-only, this implementation will respond to changing values in the source data.  &lt;br /&gt; &lt;br /&gt;The other area of potential interest is the data model.  In order to be able to join multiple pieces of data and not lose any of the data, a containment system is used.  Data is stored and accessed via Schema's that define fields on the data.  Multiple pieces of content can be put into a ContentSet and still be accessed directly by the schema's accessors.  In this way, we can put both order data along with its joined market data into a single ContentSet.  Market data is extracted using the market data schema field accessors and order data using an order schema field accessor.  A future grid implementation could determine the set of schemas and available fields at the result of the query and generate the appropriate columns.  Calculated columns could also be added by an adapter -- it could use a calculated schema to store a piece of calculated content within the ContentSet.  The grid would read and display it seamlessly.  &lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Demo
&lt;/h2&gt;Below is a screen cast of the test harness.  Pressing the &amp;quot;Populate 50&amp;quot; button adds 50 random data elements.  Clicking &amp;quot;Toggle Ask/Bid&amp;quot; changes the sort order to either the Bid or Ask column.  In the case of Bid, it does a descending and for Ask it's ascending.  While the example is a bit contrived, as you generally wouldn't query in this way, it proves that it works.  &lt;br /&gt; &lt;br /&gt;I apologize for the quality of the video; CodePlex doesn't allow you to embed a movie/flash document with the correct size, so it's an animated GIF instead.  The real application is far more responsive and smooth than the video.  &lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=Slinq&amp;amp;DownloadId=13424" alt="slinq.gif" /&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>onovotny</author><pubDate>Fri, 22 Feb 2008 00:53:40 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20080222125340A</guid></item><item><title>UPDATED RELEASE: 0.3.4 - .NET 3.5 RTM (Feb 21, 2008)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 RTM.  It also contains a fix for a race condition.</description><author></author><pubDate>Fri, 22 Feb 2008 00:52:51 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: 0.3.4 - .NET 3.5 RTM (Feb 21, 2008) 20080222125251A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/Slinq/Wiki/View.aspx?title=Home&amp;version=15</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;An implementation of LINQ focused on streaming data.
&lt;br /&gt; &lt;br /&gt;Slinq is a set of extension methods that implement the LINQ pattern geared for constantly changing data.  Examples include sensor networks, network monitors, financial services or any other push-based systems where the client needs to display or take action on &amp;quot;live&amp;quot; data.&lt;br /&gt; &lt;br /&gt;I've uploaded an initial prototype that demonstrates the idea; a lot more work is required to implement the various LINQ methods.  Please contact me with patches if you're interested in contributing.   If you have any suggestions/comments/feedback, please post in the discussion forum.  &lt;br /&gt; &lt;br /&gt;To build/run the source, you'll need Visual Studio 2008 beta 2  &lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Design Overview
&lt;/h2&gt;The test harness contains code that would normally be split among a data layer and client layer.  The MarketDataService simulates (poorly) a stream of constantly changing market data.  It runs on its own thread (a background timer) and updates the data values.  In a real application, you'd have some other listener doing this based on &amp;quot;real&amp;quot; events.  The Grid is a DataGridView in VirtualMode; there's currently a throttle (a winforms Timer) that takes a current snapshot of the query every &lt;i&gt;n&lt;/i&gt;-milliseconds.  This can, and should, be further optimized in a real application. &lt;br /&gt; &lt;br /&gt;One important thing to note is that despite the polling for snapshots, the entire query itself is &lt;i&gt;not&lt;/i&gt; being re-run each time.  The grid timer simply takes a read-lock on the stream, copies the current data into a buffer and releases the lock.  The only time the query is currently being re-run is when the &amp;quot;toggle&amp;quot; button is pressed.  That could be further enhanced to change the where clause w/o re-assembling the query.  Another important note is that while references to the data elements are being copied in a few places, the underlying data itself is in memory only once.  That is, if you have two queries against any given source, the data content is in the source once.  Only the references are moving through the query stream.&lt;br /&gt; &lt;br /&gt;When looking at the code, the real/interesting code is in the Slinq library in the StreamAdapter and SynchronizedBindingCollection classes.  The collection classes generate events that the StreamAdapters listen for and propagate as needed.  So unlike the built-in IEnumerable-based implementation where the iterators are forward-only, this implementation will respond to changing values in the source data.  &lt;br /&gt; &lt;br /&gt;The other area of potential interest is the data model.  In order to be able to join multiple pieces of data and not lose any of the data, a containment system is used.  Data is stored and accessed via Schema's that define fields on the data.  Multiple pieces of content can be put into a ContentSet and still be accessed directly by the schema's accessors.  In this way, we can put both order data along with its joined market data into a single ContentSet.  Market data is extracted using the market data schema field accessors and order data using an order schema field accessor.  A future grid implementation could determine the set of schemas and available fields at the result of the query and generate the appropriate columns.  Calculated columns could also be added by an adapter -- it could use a calculated schema to store a piece of calculated content within the ContentSet.  The grid would read and display it seamlessly.  &lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Demo
&lt;/h2&gt;Below is a screen cast of the test harness.  Pressing the &amp;quot;Populate 50&amp;quot; button adds 50 random data elements.  Clicking &amp;quot;Toggle Ask/Bid&amp;quot; changes the sort order to either the Bid or Ask column.  In the case of Bid, it does a descending and for Ask it's ascending.  While the example is a bit contrived, as you generally wouldn't query in this way, it proves that it works.  &lt;br /&gt; &lt;br /&gt;I apologize for the quality of the video; CodePlex doesn't allow you to embed a movie/flash document with the correct size, so it's an animated GIF instead.  The real application is far more responsive and smooth than the video.  &lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/Slinq/Project/FileDownload.aspx?DownloadId=13424" alt="slinq.gif" /&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>onovotny</author><pubDate>Fri, 27 Jul 2007 03:00:44 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20070727030044A</guid></item><item><title>UPDATED RELEASE: 0.3.2 - Fx 3.5 b2 compatibility (Jul 26, 2007)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 beta 2.  It also contains a few refactorings.</description><author></author><pubDate>Fri, 27 Jul 2007 02:56:23 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: 0.3.2 - Fx 3.5 b2 compatibility (Jul 26, 2007) 20070727025623A</guid></item><item><title>UPDATED RELEASE: Initial Release 0.3.1 (Jun 02, 2007)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=4635</link><description>Proof of concept that demonstrates LINQ against a streaming data source.</description><author></author><pubDate>Fri, 27 Jul 2007 02:55:39 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: Initial Release 0.3.1 (Jun 02, 2007) 20070727025539A</guid></item><item><title>UPDATED RELEASE: Beta 2 compatibility 0.3.2 (Jul 26, 2007)</title><link>http://www.codeplex.com/Slinq/Release/ProjectReleases.aspx?ReleaseId=6117</link><description>This build supports .NET 3.5 beta 2.  It also contains a few refactorings.</description><author></author><pubDate>Fri, 27 Jul 2007 02:55:17 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: Beta 2 compatibility 0.3.2 (Jul 26, 2007) 20070727025517A</guid></item></channel></rss>