views:

235

answers:

2

If you create a Filter object that contains criteria for Linq that normally goes in a where clause like this:

 var myFilterObject = FilterFactory.GetBlank();
 myFilterObject.AddCondition("Salary", "lessThan", "40000");

 var myResult = myRepository.GetEmployees(myFilterObject);

How would you match the Linq field to the Field Name without using a big case statement?

 return from e in db.Employee
        where e.Salary < 40000
        select new IList<EmployeeViewModel> { Name= e.name, Salary= e.Salary };

I assume you need to send an object to the Repository that specifies filtering so that you only pull what records you need. I assume Linq doesn't pre-compile (unless you create a customized delegate and function), so you should be able to dynamically specify which fields you want to filter.

It would be nice if you could do something like e["Salary"] like some type of Expando Object.

+3  A: 

I suggest you have a look at Dynamic Query in the Linq to SQL examples. You can use that to write conditions in "plain text", e.g.:

var employees = db.Employee.Where("Salary < 40000").Select(...);

To clarify: These extensions essentially build the same expression trees out of the string that you normally construct via lambdas, so this isn't the same as writing raw SQL against the database. The only disadvantage is that you can't use the query comprehension syntax (from x in y etc.) with it.

Aaronaught
Now that is a fantastic answer.
Dr. Zim
+1  A: 

You can build the Expression by hand, like so:

var eParam = Expression.Parameter(typeof(Employee), "e");

var comparison = Expression.Lambda(
    Expression.LessThan(
        Expression.Property(eParam, "Salary"),
        Expression.Constant(40000)),
    eParam);

return from e in db.Employee.Where(comparison)
       select new EmployeeViewModel { Name = e.name, Salary = e.Salary };
scmccart
Very nice way to add conditions.
Dr. Zim