Tuesday, January 23, 2007

I've started work on the search piece of our application.  Searching (no pun intended) for some inspiration on how users might want to search within our application, I brought up the current WinForms version, and then the ASP.NET version.

I realized that we need to make searching easier in WinForms client, currently when searching for a patient in our WinForms client, you are presented with a separate text box for first name, last name, SSN, date of birth, and health record number.  Our ASP.NET client presents just one text box to search all of those fields.

Tying the Domain Model to the Data Access Layer

So I started thinking about all the pieces in our domain model that we might want to allow the user to search.  Then I realized that to allow searching across all the fields in an entity would tie the data access layer (DAL) to  the domain model ala something like this:

public IList<Patient> Search(string text) { ICriteria criteria = session.CreateCriteria(typeof(Patient)); Disjunction or = Expression.Disjunction(); text = string.Format("%{0}%", text); or.Add(Expression.Like("FirstName", text)); or.Add(Expression.Like("MiddleName", text)); or.Add(Expression.Like("LastName", text)); crit.Add(or); return criteria.List<Patient>(); }

Variations of this code would have to be repeated for every data access class in our DAL.  You could create a string list of the properties on the entity to search and pass them to a method that would build your criteria; but at the end of the day, your still tying your domain model to your data access layer.

Custom Attributes

I started doing some thinking about how unit testing frameworks such as  work and realized I could use .NET custom attributes and some reflection to solve the problem.

I came up with an attribute called Search, currently it takes in one boolean parameter called Enabled.

1 using System; 2 using System.Reflection; 3 4 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 5 public class SearchAttribute : System.Attribute 6 { 7 public bool Enabled; 8 9 /// <summary></summary> 10 /// </summary> 11 /// <param name="Enabled">if true, property will be included in object-level searches</param> 12 public SearchAttribute(bool Enabled) 13 { 14 this.Enabled = Enabled; 15 } 16 }

I could have written it as:

1 using System; 2 using System.Reflection; 3 4 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 5 public class SearchAttribute : System.Attribute { }

But I wanted the flexability of adding named parameters in the future.  Who knows, maybe this is a lame reason, and I should just refactor the code if I want to add parameters to it in the future.

Adding the Attribute to Your Domain Model

The interesting thing about a custom attribute, is if it ends in Attribute (i.e. SearchAttribute), its name gets changed to Search by the C# compiler(?), although you could still use SearchAttribute as the name when you add it to your properties.  If you look at the IL, its still called SearchAttribute:

.custom instance void MyNamespace.SearchAttribute::.ctor(bool) = ( bool(true) )

But if you change the attribute name to SearchAttrib, or SearchAttributes, then you have to use the full name when decorating the properties in your class.  This really isn't germane to the topic at hand, I just thought it was neat! :)

Example:

1 public class Patient 2 { 3 [Search(true)] 4 public string FirstName 5 { 6 get { return _firstName; } 7 set { _firstName = value; } 8 } 9 ... 10 }

Pulling it All Together

The custom attribute is great and all, but it doesn't inherently buy us anything.  We need to add a little bit more to make all this work.  This is a simplified version of what I ended up putting in my DAL base class:

1 private IList<Patient> Search(string text) 2 { 3 Type type = typeof(Patient); 4 ICriteria criteria = _session.CreateCriteria(type); 5 6 Disjunction or = Expression.Disjunction(); 7 foreach (PropertyInfo propInfo in type.GetProperties()) 8 { 9 //SearchableAttribute is AllowMultiple = false, so we only need the first item 10 Attribute[] attribs = Attribute.GetCustomAttributes(propInfo, typeof(SearchAttribute)); 11 if (attribs.Length == 0) 12 continue; 13 14 if (((SearchAttribute)attribs[0]).Enabled) 15 or.Add(Expression.InsensitiveLike(propInfo.Name, string.Format("%{0}%", text))); 16 } 17 criteria.Add(or); 18 return criteria.List<T>(); 19 } 20

Again, this is a simplified version of what's in our DAL base class, the actual signature looks more like this: private IList<T> Search<T>(string text) so that I don't have to write a version of this for each class in our domain model I want to enable searching for.

Everything above should be pretty self-explanatory unless you aren't familiar with the NHibernate Criteria API; in which case the Expression.Disjunction bit on line 6 is how you do an OR (a OR b OR c)when searching.  You can also do Expression.Conjunction if you want AND searching (a AND b AND c).

The original version of this code had a second foreach loop which spun through all the attributes on each property looking for the SearchAttribute.  I thought to myself that their had to be a better way and did a little bit of poking around, and discovered much to my delight that the static method Attribute.GetCustomAttributes allows you to specify what kind of attribute you are searching for!

Limitations

In the code above, you'll get an Exception if you try to search against non-text columns in your database so you will need to that into account when putting the Search attribute in your Domain Model; or add some more smarts to the Search method to take into account different data types.

Comments

If you've read down this far, then I'd love to get a comment from you.  Is there anything you think I could do a better job of explaining, am I an awesome guy?  Or do I suck, either way, I'd like to know, so please leave me a comment!

If you like my article, please kick it at .NET Kicks (I have no idea why the kick counter says I have zero kicks btw)!

posted on Tuesday, January 23, 2007 11:02:42 AM (Alaskan Standard Time, UTC-09:00)  #    Comments [2]
Related posts:
LINQ Goodness
De-crapify your code base with AOP using PostSharp
Creating Windows Firewall Exceptions
Problems serializing class which inherits from a generic list
ASP.NET Resource Refactoring
NHibernate, DateTime and UTC

Referred by:
http://www.dotnetkicks.com/csharp/Using_Custom_Attributes_to... [Referral]
http://dotnetkicks.com/upcoming [Referral]
http://www.dotnetkicks.com/ [Referral]
http://www.google.com/reader/view/ [Referral]
http://dotnetkicks.com/ [Referral]
NHibernate (www.google.com) [Referral]
http://dotnetkicks.com/tags/C%23 [Referral]
http://www.dotnetkicks.com/page/2 [Referral]
http://www.dotnetkicks.com/csharp [Referral]
custom attributes IE (www.google.ca) [Referral]
viewing custom attributes .net (www.google.com) [Referral]
http://www.dotnetkicks.com/page/3 [Referral]
types search in custom attributes c# (www.google.com.br) [Referral]
nhibernate (blogsearch.google.com) [Referral]
c# patient search example (www.google.ca) [Referral]
custom attribute classes in domain object (www.google.com.au) [Referral]
http://www.dotnetkicks.com/page/4 [Referral]
using custom attributes (www.google.com) [Referral]
nhibernate criteria search object property (www.google.co.ve) [Referral]
c# nHibernate criteria (www.google.com.br) [Referral]
http://www.dotnetkicks.com/popular/pastyear/page/45 [Referral]
c# custom attributes (www.google.com) [Referral]
C# Custom Attributes IList (www.google.com) [Referral]
.net c# attribute custom list (www.google.co.il) [Referral]
nhibernate criteria disjunction (www.google.com) [Referral]
searching in IList<> (www.google.se) [Referral]
Add(Expression.Conjunction( (www.google.com) [Referral]
crit.Add(Expression.Disjunction()); example (www.google.pt) [Referral]
attributes C# DAL (www.google.com) [Referral]
NHibernate Criteria case (www.google.com) [Referral]
Expression.InsensitiveLike (www.google.com) [Referral]
DAL Reflection C# (www.google.com) [Referral]
.net find all classes with custom attribute (www.google.dk) [Referral]
C# custom attributes list (www.google.com) [Referral]
C# Custom Attributes (www.google.com) [Referral]
attribute .net custom (www.google.ca) [Referral]
c# attribute parameter limitations (www.google.com) [Referral]
c# search atributes properties (www.google.com) [Referral]
why attribute using.system (www.google.co.uk) [Referral]
expression.conjunction (www.google.com) [Referral]
C# searching in IList (www.google.com.tr) [Referral]
quickly search list<T> for object c# (www.google.gr) [Referral]
http://www.dotnetkicks.com/tags/search [Referral]
using custom attributes csharp (www.google.com) [Referral]
atributes and reflection c# (www.google.hr) [Referral]
nhibernate criteria disjunction (www.google.com) [Referral]
C# Like @LastName textbox parameters (www.google.com.au) [Referral]
formatting using attributes .net (www.google.com.au) [Referral]
what kind of code used in custom attribute class in c# (www.google.co.in) [Referral]
how to add custom attribute to textbox (www.google.com) [Referral]
nhibernate criteria api examples (www.google.it) [Referral]
nhibernate Or criteria Expression.Disjunction (www.google.com) [Referral]
.net C# Custom Attributes (www.google.com) [Referral]
add(Expression.like (www.google.es) [Referral]
Expression.Conjunction (www.google.ru) [Referral]
asp textbox custom attribute (www.google.ca) [Referral]
enable textbox through Attribute ADD (www.google.com) [Referral]
GetProperties custom Attribute (www.google.com) [Referral]
"c#" "custom attributes" looping (www.google.com) [Referral]
asp TextBox attributes enabled c# (www.google.pt) [Referral]
Disjunction nhibernate (www.google.no) [Referral]
enable Custom Attribute (www.google.de) [Referral]
using + text box Attributes + c# (www.google.com) [Referral]
patient domain model firstname lastname (www.google.com) [Referral]
asp.net add custom attribute (www.google.com) [Referral]
custom attributes.net c# sample (www.google.com) [Referral]
accessing custom attributes property (www.google.se) [Referral]
c# custom attributes GetCustomAttributes (www.google.fi) [Referral]
custom attributes to html text box (www.google.com) [Referral]
C# atribute (www.google.com) [Referral]
castle activerecord custom attribute (www.google.com) [Referral]
load all custom attributes for all classes (www.google.com) [Referral]
is .NET C# custom attributes really useful? (www.google.ca) [Referral]
.net property custom attributes (www.google.com) [Referral]
c# custom web page attribute (www.google.com) [Referral]
TextBox.Attributes c# (www.google.cl) [Referral]
nhibernate criteria api (www.google.bg) [Referral]
SubSonic add where LIKE expression (www.google.bg) [Referral]
ActiveRecord Custom Access in attributes (www.google.com) [Referral]
using Expression.Conjunction (www.google.com) [Referral]
winforms firewall exception (www.google.com) [Referral]
custom attribute 6 (www.google.ca) [Referral]
enable propertyinfo in a class (www.google.com.ph) [Referral]
custom attributes Parameter (www.google.com) [Referral]
C# NHibernate CreateCriteria "or" (www.google.com) [Referral]
C# NHibernate CreateCriteria Disjunction (www.google.com) [Referral]
nhibernate disjunction (www.google.com) [Referral]
PostSharp Attribute GetCustomAttributes (www.google.co.nz) [Referral]
c# reflection find all custom attribute (www.google.co.uk) [Referral]
custom text attributes c# (www.google.co.za) [Referral]
"searching" "criteria" code c# (www.google.com.bh) [Referral]
postsharp create custom Attribute instance (www.google.com) [Referral]
acessing custom attribute c# (www.google.com.br) [Referral]
C# access CustomAttributes from a static method (www.google.com) [Referral]
csharp Attribute simplify Reflection (www.google.com) [Referral]
search records using createcriteria (www.google.com.sg) [Referral]
accessing non custom field attribute reflection (www.google.co.uk) [Referral]
Criteria NHibernate Expression.Conjunction() (www.google.ch) [Referral]
http://torrents.googlehlp.com/ [Referral]
C# find all classes with attribute (www.google.com) [Referral]
XmlSerializer List<T> attribute (search.live.com) [Referral]
textbox attributes c# (www.google.pt) [Referral]
Using Custom Attributes in ASP.NET (www.google.com) [Referral]
expression.disjunction (www.google.com) [Referral]
using attributes for ORM C# (www.google.com) [Referral]
atributes in c# (www.google.com) [Referral]
http://www.milkcarton.com/ [Referral]
http://www.lowesthosting.info/Domain%20Searches.htm [Referral]
c# atributes (www.google.ie) [Referral]
asp.net + class "ATTRIBUTES LIST" (www.google.co.in) [Referral]
string data = "First Name:" + firstname.Text; more strings C# (www.google.com) [Referral]
Custom Attributes enable (www.google.com.tr) [Referral]
C# adding code with a custom attribute (www.google.pt) [Referral]
c# orm field attributes (www.google.de) [Referral]
createcriteria nhibernate inherit class property base (www.google.com.ar) [Referral]
c# castle activerecord custom method (www.google.nl) [Referral]
creating and accessing custom Attributes html asp.net (www.google.com) [Referral]
custom attributes C# without looping (www.google.co.in) [Referral]
asp:textbox.attributes (www.google.com.pk) [Referral]
enable textbox asp .net c# (www.google.com) [Referral]
IE Winforms customize .NET Domain (www.google.com.ua) [Referral]
Seraching using a textbox (www.google.co.za) [Referral]
c# Custom Page Attribute (www.google.com) [Referral]
c# custom entity dal (www.google.es) [Referral]
Search all attributes C# (www.google.com) [Referral]
c# reflection custom attributes property (www.google.de) [Referral]
C# get custom attributes textbox (www.google.bg) [Referral]
nhibernate conjunction and disjunction (www.google.co.uk) [Referral]
"custom attribute" domain (www.google.com) [Referral]
c# custom attribute to textbox (www.google.com) [Referral]
attributes + csharp (www.google.co.za) [Referral]
how to query custom attribute google base (www.google.co.in) [Referral]
atributes c# (www.google.com.br) [Referral]
searching (search.live.com) [Referral]
attributes + csharp + parameters (www.google.co.za) [Referral]
c# CustomAttributes (www.google.co.uk) [Referral]
C# custom attribute property (www.google.com) [Referral]
System.reflection getting custom attributes (www.google.com) [Referral]
nhibernate criteria disjunction or (www.google.ca) [Referral]
c# textbox Attributes (www.google.com.hk) [Referral]
C# CustomAttributes (www.google.com) [Referral]
c# textbox add custom attributes (www.google.com.au) [Referral]
using custom attribute problem c# (www.google.no) [Referral]
c# attributes add enabled false (www.google.com) [Referral]
C# custom attributes (www.google.nl) [Referral]
google base query custom attributes (www.google.com) [Referral]
asp.net c# textbox attributes list (www.google.co.uk) [Referral]
nhibernate.createcriteria (www.google.com) [Referral]
propinfo attributes (www.google.co.za) [Referral]
c# reflection find properties with custom attribute (www.google.com) [Referral]
using reflection on IList<T> (www.google.co.in) [Referral]
custom attributes vi client (www.google.com) [Referral]
custom attribute reflect on decorating field (www.google.com) [Referral]
nhibernate attributes (www.google.com) [Referral]
adding cutom attributes to the asp.net textbox (www.google.co.in) [Referral]
get custom attributes method (www.google.com.au) [Referral]
c# domain objects (www.google.ro) [Referral]
activerecord custom access (www.google.pt) [Referral]
activerecord custom attributes (www.google.ch) [Referral]
icriteria like .CreateCriteria nhibernate (www.google.com.ar) [Referral]
get noncustom attribute value reflection C# (www.google.co.uk) [Referral]
accessing "non custom" attribute reflection (www.google.co.uk) [Referral]
textbox attributes+C# (www.google.com) [Referral]
how to add attribute in textbox by c# code (www.google.com.hk) [Referral]
reflection get properties list with custom attribute (www.google.ru) [Referral]
searching a IList (www.google.co.in) [Referral]
custom serialization in Nhibernate Domain classes (www.google.co.in) [Referral]
loop through Add attributes c# textbox (www.google.co.in) [Referral]
.net c# attributes reflextion find class (www.google.se) [Referral]
static atribute @Entity (www.google.es) [Referral]
c# dal attribute (www.google.com) [Referral]
C# DAL generic attributes (www.google.co.uk) [Referral]
GetProperties CustomAttributes (www.google.ca) [Referral]
NHibernate Disjunction (www.google.ru) [Referral]
adding custom attribute in a textbox + asp.net (www.google.co.in) [Referral]
activerecord custom attributes (www.google.co.kr) [Referral]
activerecord csharp sample (www.google.com.vn) [Referral]
.net custom attribute for a property (www.google.com) [Referral]
asp.net custom attributes (www.google.ca) [Referral]
c# custom attributes accessing field (www.google.ca) [Referral]
csharp custom attributes (www.google.com) [Referral]
using a html textbox for searching (www.google.ca) [Referral]
Custom Attributes c# exampel (www.google.com) [Referral]
how to get custom attributes on an instance (www.google.com.sg) [Referral]
Reflection get custom attributes (www.google.com) [Referral]
add custom attribute to textbox c# (www.google.com) [Referral]
list of attributes for text box in C# (www.google.com) [Referral]
nhibernate conjunction (www.google.co.in) [Referral]
attributes enabled in c# (www.google.com) [Referral]
sample google database with custom attributes (www.google.com) [Referral]
reflection dal (www.google.fr) [Referral]
DAL in C# (www.google.co.in) [Referral]
c# using custom attribute (www.google.co.kr) [Referral]
castle activerecord expression conjunction (www.google.ca) [Referral]
nhibernate conjunctions (www.google.com.au) [Referral]
How to get the current System date in textbox using csharp (www.google.co.in) [Referral]
c# reflection get custom attribute on property (www.google.com.au) [Referral]
custom entities c# DAL (www.google.es) [Referral]
C# get methods with custom attribute (www.google.tt) [Referral]
c# reflection IList<t> create (www.google.com) [Referral]
find classes custom attribute (www.google.dk) [Referral]
custom access criteria (www.google.com) [Referral]
get all classes using attributes .net (www.google.co.uk) [Referral]
rss 2.0 custom attributes (www.google.be) [Referral]
"Custom Entity" nhibernate ilist (www.google.com) [Referral]
how to add custom attributes for each property (www.google.com) [Referral]
activerecord custom attributes fields (www.google.com) [Referral]
NHibernate Custom Attributes (www.google.com.br) [Referral]
postsharp customattributes (www.google.dk) [Referral]
custom attributes property C# AttributeTargets.Property (www.google.fr) [Referral]
activerecord custom attribute (www.google.com) [Referral]
_session.createCriteria attribut (www.google.fr) [Referral]
access ad custom attributes (www.google.com) [Referral]
.net winform add custom attributes (www.google.com) [Referral]
custom attributes in C# sample (www.google.co.in) [Referral]
"Custom Field" nhibernate (www.google.it) [Referral]
decorate custom attributes reflection c# (www.google.com) [Referral]
.net textbox custom attribute element (www.google.co.nz) [Referral]
Custom Attribute problem called (www.google.co.in) [Referral]
c# search code using textbox (www.google.com.ph) [Referral]
C# searching for properties with custom attribute (www.google.com) [Referral]
C# find all classes with custom attribute (www.google.ca) [Referral]
nhibernate custom fields (www.google.com) [Referral]
accessing custom attribute properties (www.google.com) [Referral]
activerecord custom attribute (www.google.com) [Referral]
activerecord add custom attributes (www.google.com) [Referral]
add enable Attributes c# (www.google.com.tr) [Referral]
using custom attributes in methods c# (www.google.com) [Referral]
c# attribute reflection class show textbox (www.google.com) [Referral]
rss custom attributes (www.google.co.uk) [Referral]
.net custom attribute stringFormat (www.google.com) [Referral]
problem using custom attributes + C# (www.google.co.in) [Referral]
activerecord custom attribute (www.google.co.uk) [Referral]
text box attributes enables (www.google.ca) [Referral]
activerecord custom attributes (www.google.com) [Referral]
"Disjunction()" nhibernate (www.google.com) [Referral]
nhibernate createcriteria disjunction (www.google.fr) [Referral]
createCriteria using two classes (www.google.co.in) [Referral]
decorate textbox member with attribute (www.google.com) [Referral]
reflect custom attribute on field (www.google.com) [Referral]
nhiberante conjunction example (www.google.com) [Referral]
DAL + c# + custom attributes (www.google.nl) [Referral]
using custom attributes in C# (www.google.com) [Referral]
property attributes custom (www.google.com) [Referral]
nhibernate (www.dotnetkicks.com) [Referral]
reflection+attributes.add() (www.google.com) [Referral]
getproperties reflection attribute (www.google.at) [Referral]
linq Like disjunction (www.google.com) [Referral]
csharp using custom attributes (www.google.co.il) [Referral]
c# atributes (www.google.pl) [Referral]
how to create custom textbox in c# winforms (www.google.co.in) [Referral]
custom attribute csharp (www.google.com.br) [Referral]
C# TextBox attributes (www.google.ie) [Referral]
how to add a custom attribute to an html text field (www.google.com) [Referral]
.net load class from db dal attribute (www.google.com) [Referral]
c# find all custom attributes (www.google.com) [Referral]
c# add attribute to textbox (www.google.com) [Referral]
orm c# attributes (www.google.se) [Referral]
using custom attribute (www.google.co.in) [Referral]
repeated text on a textbox-C# (www.google.co.zw) [Referral]
csharp custom attribute (www.google.be) [Referral]
attribute of textbox with C# function (www.google.com) [Referral]
query custom attributes in "google base" (www.google.com) [Referral]
criteria.Add(Expression.Like C# (www.google.cl) [Referral]
csharp attritubes tutorial field (www.google.com) [Referral]
how to get results to your expresson in textbox using asp.net (www.google.co.in) [Referral]
How to get custom attribute properies (www.google.co.in) [Referral]
NHibernate 2.0 Expression.Conjunction (www.google.com.by) [Referral]
C# atributes (www.google.com.co) [Referral]
using C# to enable textbox (www.google.com) [Referral]
activerecord add custom attribute (www.google.com) [Referral]
CreateCriteria "string list" (www.google.es) [Referral]
linq reflection attributes (www.google.com) [Referral]
"get Properties list" c# (www.google.com) [Referral]
nhibernate custom-fields (www.google.com) [Referral]
c# get classes with attribute (www.google.com) [Referral]
asp.net reflection Get Property From Custom Attribute (www.google.com) [Referral]
c# addattribute "AttributeTargets.Property" (www.google.it) [Referral]
activerecord class custom attribute (www.google.com.tr) [Referral]
Query String Parameters using Custom Attributes and Reflection c# (www.google.com) [Referral]
expression.like datetime nhibernate (www.google.com) [Referral]
system.reflection + getproperties + attributes (www.google.com) [Referral]
useful .net custom attribute example (www.google.fr) [Referral]
unit test custom attribute (www.google.nl) [Referral]
reflection find method with custom attribute (www.google.co.uk) [Referral]
C# XmlSerializer object how to add custom attribute (www.google.se) [Referral]
postsharp getcustomattributes (www.google.com.tr) [Referral]
asp.net c# "get custom attributes" (www.google.com) [Referral]
asp.net c# "add custom attribute to textbox" (www.google.com) [Referral]
Custom Access Castle attribute (www.google.it) [Referral]
Get non custom Attributes .Net (www.google.com) [Referral]
C# Use a custom domain account (www.google.ca) [Referral]
c# textbox get attribute (www.google.com) [Referral]
ActiveRecord c# CreateCriteria (www.google.com) [Referral]
c# custom attributes access name (www.google.de) [Referral]
NHibernate.Expression Conjunction (www.google.com) [Referral]
company[] C# custom entity (www.google.co.uk) [Referral]
foreach textbox in C# add attribute (www.google.com) [Referral]
linq disjunction (search.live.com) [Referral]
nhibernate.createcriteria (www.google.ca) [Referral]
activerecord expression.like (www.google.com.br) [Referral]
dal system.attribute "custom attribute" (www.google.pt) [Referral]
asp textbox 'custom attribute" (www.google.bg) [Referral]
ASPNET how to use reflection to "find properties" (www.google.co.uk) [Referral]
using attribs in article (www.google.no) [Referral]
reflection linq find classes with custom attribute (www.google.com) [Referral]
C# Find All Custom attribute (www.google.co.uk) [Referral]
enable custom attributes in AD (www.google.com) [Referral]
castle activerecord custom attribute (www.google.nl) [Referral]
c# custom database serializer attribute (www.google.com) [Referral]
C# = Html.TextBox Enable (www.google.com) [Referral]
http://fndjbdiw.servetown.com/hardcore-lesbian-sex-movies.ht... [Referral]
http://lasvegas.craigslist.org/jwl/801417769.html [Referral]
asp.net custom attributes (www.google.com.au) [Referral]
attributes in c# winform (www.google.co.in) [Referral]
nhibernate.attributes [Query] (www.google.co.uk) [Referral]
Using custom attributes to add code to a method (www.google.com) [Referral]
http://ifvruarf.freecities.com/brianna-blaze-hardcore.html [Referral]
http://heewidue.250m.com/hardcore-bondage-picture.html [Referral]
c# castle activerecord findall reflection (www.google.com) [Referral]
http://ntimrcxe.wtcsites.com/asian-chick-hardcore-sex.html [Referral]
http://kqsnfuoj.servetown.com/download-film-free-hardcore.ht... [Referral]
castle +activerecord +formatting (www.google.com) [Referral]
custom attributes for TextBox (www.google.com) [Referral]
C# cool use for custom attributes (www.google.com) [Referral]
nhibernate disjunction (www.google.com) [Referral]
c# reflection find custom attributes (www.google.co.uk) [Referral]
adding attributes c# using a for loop (www.google.com) [Referral]
http://uxokgyyt.741.com/hardcore-nylons-stocking.html [Referral]
get custom attributes html (www.google.com) [Referral]
custom attribut winform (www.google.fr) [Referral]
custom milk carton box (www.google.com) [Referral]
c# orm field attribute (www.google.com.au) [Referral]
reflection custom attributes (www.google.pl) [Referral]
http://aicujepv.freewebsitehosting.com/asian-free-lesbian-se... [Referral]
Accessing through the attributes of a Textbox in .Net (www.google.co.in) [Referral]
attribute dal .net (www.google.com.gt) [Referral]
http://abussrjx.bravepages.com/lesbian-amateur-milf.html [Referral]
searching custom entity c# (www.google.com) [Referral]
http://akiiilma.mindnmagick.com/lesbian-ass-fucking-with-str... [Referral]
attribute and reflection and data access layer (www.google.com) [Referral]
quick search in IList C# (search.live.com) [Referral]
custom attributes fields (www.google.pt) [Referral]
nhibernate disjunction (www.google.com) [Referral]
custom attributes for a text box c# (www.google.co.in) [Referral]
http://fomoajoa.freewebsitehosting.com/farris-kiss-lesbian.h... [Referral]
http://ihnduteg.designcarthosting.com/ass-cheerleader-lesbia... [Referral]
http://ciobgvoi.freecities.com/dildo-ebony-lesbian.html [Referral]
using custom attributes by name (www.google.com) [Referral]
http://ihnduteg.designcarthosting.com/hot-lesbian-ass-lickin... [Referral]
http://dzlkoxry.fcpages.com/free-lesbian-dildo-fucking.html [Referral]
asp.net page allow custom attributes (www.google.com.ua) [Referral]
http://zgresste.sporshok.org/lesbian-sex-in-shower.html [Referral]
c# custom field attribute (www.google.com) [Referral]
set referral page attributes C# (www.google.com) [Referral]
custom attributes on linq class (www.google.co.uk) [Referral]
textbox custom attribute C# (www.google.pl) [Referral]
get custom attributes of a function + c# (www.google.com) [Referral]
add custom attributes to domain entity (www.google.com) [Referral]
http://uteqxzwu.designcarthosting.com/dating-lesbian-online-... [Referral]
searching entities c# (www.google.com) [Referral]
xmlserializer attributes dal (www.google.com) [Referral]
castle activerecord using Custom Access (www.google.co.uk) [Referral]
c# textbox custom (www.google.fr) [Referral]
generic attribute c# (www.google.ru) [Referral]
db custom attributes realization (www.google.com.ua) [Referral]
entity model custom attributes (www.google.sk) [Referral]
access Ilist last field class nhibernate Criteria.Add(Expression (www.google.com.br) [Referral]
c#+property+attribute+add+reflection (www.google.com.au) [Referral]
castle attributes.html (www.google.com) [Referral]
"C#" "custom attribute" uses (www.google.com) [Referral]
c# get property custom Attribute PropertyInfo (www.google.co.uk) [Referral]
nhibernate expression.disjunction (www.google.com) [Referral]
query custom attribute (www.google.com) [Referral]
aop for domain entities (www.google.co.in) [Referral]
- http://uteqxzwu.designcarthosting.com (www.google.com) [Referral]
c# custom attribute linq (www.google.de) [Referral]
get custom attribute (www.google.com) [Referral]
find property with custom attribute c# (www.google.com) [Referral]
Html.TextBox attributes (www.google.com.ua) [Referral]
c# find method with custom attribute (www.google.co.uk) [Referral]
reflection custom attribute propinfo (www.google.com) [Referral]
using custom html attribute (www.google.hu) [Referral]
custom bit attribute (www.google.es) [Referral]
textbox attribute c# (www.google.fi) [Referral]
http://www.google custom attributes.net/ (www.google.com) [Referral]
textbox attributes in C# (www.google.co.in) [Referral]
castle activerecord custom attributes (www.google.com.au) [Referral]
create custom method attribute .net (www.google.com) [Referral]
http://zgresste.sporshok.org/lesbian-bath-shower.html [Referral]
custom attributes in a text box field (www.google.com) [Referral]
c# custom attribute (search.live.com) [Referral]
http://delicious.com/dvhthomas/orm [Referral]
custom attribute tr (www.google.co.in) [Referral]
reflection find properties with custom attribute (www.google.co.uk) [Referral]
c# Html.TextBox attributes (www.google.co.il) [Referral]
custom attributes method winforms (www.google.com) [Referral]
activerecord custom attributes (www.google.com) [Referral]
http://www.dotnetkicks.com/tags/NHIbernate/page/4 [Referral]
LINQ Expression GetProperty of custom attribute (www.google.com) [Referral]
love dating in www.google.com.bh (www.google.com.bh) [Referral]
".custom instance" postsharp (www.google.com) [Referr