我想知道是否可以将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表达式“解析”属性,但是如何?