Thursday, February 16, 2012

Create a fast compiled method invoker using LINQ

  1. var method = new Func<double, double, double>(Math.Pow).Method;
  2. var parameter = Expression.Parameter(typeof(object[]));
  3. var args = method.GetParameters()
  4. .Select((param, i) => Expression.Convert(
  5. Expression.ArrayIndex(parameter, Expression.Constant(i)), param.ParameterType));
  6. var expr = Expression.Lambda<Func<object[], object>>(
  7. Expression.Convert(Expression.Call(method, args), typeof(object)), parameter);
  8. var invoker = expr.Compile();
  9. var result = invoker(new object[] {Math.PI, 2.0});

Friday, February 10, 2012

Create a Google calendar event in an existing calendar

  1. var credentials = new GDataCredentials(userName, password);
  2. var service = new CalendarService(null) {Credentials = credentials};
  3. var query = new CalendarQuery("https://www.google.com/calendar/feeds/default/owncalendars/full");
  4. var feed = service.Query(query);
  5. var eventFeedLink = feed.Entries.Cast<CalendarEntry>()
  6. .Where(item => item.Title.Text == calendarName)
  7. .SelectMany(item => item.Links)
  8. .First(link => link.Rel == GDataParserNameTable.NSGCal + "#eventFeed");
  9. var entry = new EventEntry(title) {Times = {new When(start, end, allDay)}};
  10. service.Insert(new Uri(eventFeedLink.AbsoluteUri), entry);
Google Data API .NET client library

Thursday, February 2, 2012

Page through potentially large NHibernate criteria query results

  1. public static IEnumerable<T> Enumerate<T>(this ICriteria criteria, int pageSize = 1000)
  2. {
  3. var entityCount = CriteriaTransformer.TransformToRowCount(criteria).UniqueResult<int>();
  4. var pageCount = (int) Math.Ceiling(entityCount/(double) pageSize);
  5. criteria = CriteriaTransformer.Clone(criteria).SetMaxResults(pageSize);
  6. return Enumerable.Range(0, pageCount)
  7. .SelectMany(pageNum => criteria.SetFirstResult(pageNum*pageSize).List<T>());
  8. }
NHibernate