可以将lambda表达式转换为sql where子句吗?

时间:2013-07-30 06:18:27

标签: c# sql lambda where data-access-layer

我想知道是否可以将lambda表达式或linq作为参数传递给DB访问方法,然后“构建”where子句以附加到select命令中?

例如,如果我有以下类:

class Person
{
     public int Id { get; set; }
     public TimeSpan Age { get; set; } // cool
     public string Name { get; set; }

     public static List<Person> Load(/*something here, let's call "argument"*/)
     {
          SqlCommand cmd = new SqlCommand();
          cmd.CommandText = " select * from Persons " + Persons.TransformIntoWhere(argument);
          // Executes and returns a list<Person> ...
     }

     public static string TransformIntoWhere(argument)
     { 
          string where = // what in here?
          return where;
     }
} 

行为应该是这样的:

 List<Person> MyList = Person.Load(p => p.Name.Contains("a") && p.Age > TimeSpan.FromYears(18));

然后选择

select * from Persons where name like '%a%' and age > 18

我知道这是一个非常丑陋的例子,但它清楚地显示了我正在尝试做的事情。

这将是非常好的,因为它将提供一种强类型的方法来从DataBase类外部添加where。此外,IMO这将比

更好
List<Person> MyList = Person.Load().Where(p => p.Name.Contains("a") && p.Age > TimeSpan.FromYears(18));

因为这样可以避免从数据库加载不必要的数据;并且比使用属性作为参数创建大量“Load”方法重载更好,因为它到目前为止更干净,并且比将where字符串直接传递到load方法要好得多。

那么,有什么想法/建议吗?

我认为首先要做的是从lambda表达式“解析”属性,但是如何?

0 个答案:

没有答案