Archive for September, 2008
c# dynamically picking the search direction with linq
by brian on Sep.30, 2008, under .NET, c#, linq, sql
I’ve recently been writing an application that builds a linq to sql query dynamically. For instance:
MyDataContext dc() = new MyDataContext; var query = dc.MyTables; query = query.Where( t=>t.id > 10);
and so I want to order it by a certain column:
query = query.OrderBy( t=>t.id )
but the problem is the order direction isn’t know before hand so at first I was stuck with the following:
if ( descending )
query = query.OrderByDescending( t=>t.id);
else
query = query.OrderBy(t=>t.id);
Now if there is only a few possible columns to sort against it isn’t too bad. But when you have 10 different possible columns it really makes a lot of extra work just to control to sort direction. So I made a little helper class that allows the following. It works with linq and linq to sql:
query = query.OrderByAscDec( t=>t.id, descending );
here’s the static class that implments the OrderByAscDec function:
static class VPLinqExtensions
{
public static IOrderedQueryable<TSource> OrderByAscDes<TSource, TKey>(
this IQueryable<TSource> source,
System.Linq.Expressions.Expression<Func<TSource,
TKey>> keySelector, bool IsDescending)
{
if (IsDescending)
return source.OrderByDescending(keySelector);
else
return source.OrderBy(keySelector);
}
}
c# non-blocking sockets
by brian on Sep.15, 2008, under .NET, c#, networking
There doesn’t seem to be much written on blocking socket with c#. So I’ll write a very short piece, and I’ll only concentrate on client sockets.
Creating a socket is easy here is how:
using System.Net.Sockets; //... // Creating a connection Socket client; client = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); client.Connect(hostName, port); client.Blocking = false; // This needs to be done after Connect or it will error out.
Here’s how to write data to the socket
// Writing information to the socket
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(messageText);
foreach (byte c in buffer)
{
SocketError err = SocketError.WouldBlock;
// need to try again if the socket would have blocked
while ( err == SocketError.WouldBlock )
{
// this version of Send must be used or an exception would be thrown, which I feel is a pain
// to deal with -- this way you can see handle the error appropriately.
client.Send(buffer, 0, 1, SocketFlags.None, out err );
}
if ( err != SocketError.Success )
{
// handle error
break;
}
}
And now code to read from a non-blocking socket
// Reading from the socket
// this loop keeps going until there is a socket error or a '0' byte is read which
// in this example marks the end of the message
System.Text.StringBuilder message = new System.Text.StringBuilder();
while ( true )
{
byte c = 0;
int bytesRead;
SocketError err;
// read a character.
bytesRead = client.Receive(buffer, 0, 1, SocketFlags.None, out err );
// checking what happened
if ( SocketError.Success == err )
{
// read a byte! Let's process it
if ( bytesRead > 0 )
{
// found a null character -- in this case it makes the end of a message.
if (c == 0)
{
// null terminated message received
break;
}
else
message.Append((char)c);
}
}
}
else if ( SocketError.WouldBlock != err )
{
break;
}
}
c# Reading the contents of a web page
by brian on Sep.10, 2008, under .NET, c#, coding
Reading the contents of a web page can be very useful. Here’s some code I’m developing to read the historical stock prices from http://finance.google.com
string uri = "http://finance.google.com/finance/historical?cid=667226&startdate=Sep+9%2C+2007&enddate=Sep+10%2C+2008&output=csv";
WebRequest request = WebRequest.Create(uri);
WebResponse response = request.GetResponse();
var stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("utf-8"));
string page = reader.ReadToEnd();
There you go. Very simple isn’t it? Just got to love .Net
