我是c#新手,正在使用Linqpad中的Linq To SQL从数据库中获取数据。在我的数据库中,我有很多列,由于传统的原因,这些列的名字是Col1,Col2,Col3等。
目前我必须记住哪个Column引用哪个值,才能提取数据。
而不是必须写。
Clients.Where(c => c.Col1443 == true)
我希望能够做一些类似下面的事情。
var HasRedEyes= "Col1443";
Clients.Where(c => c.HasRedEyes == true)
请注意,我需要将其翻译成SQL,因为我需要从数据库中获取这些数据,这些数据不是本地化的。
你真的应该想办法A.重命名你的列,B.减少列的数量(1000多列有点多)。我已经很久没有使用LINQ to SQL了,但如果你需要的只是查询能力,你是否可以定义一个视图,用列的别名代替?
撇开这一点不谈,解决这个问题的一个方法是定义命名的表达式,代表预定义的过滤器。例如,假设这个类的名字是 Client
:
Expression<Func<Client, bool>> hasRedEyes = c => c.Col1443; // == true is implicit
var query = Clients.Where(hasRedRyes).ToList();
但请注意,这些都是可以合成的,如果你 AND
它们通过连续调用*到 Where
:
Expression<Func<Client, bool>> hasRedEyes = c => c.Col1443;
Expression<Func<Client, bool>> hasBrownHair = c => c.Col1567 == "brown";
var query = Clients.Where(hasRedEyes).Where(hasBrownHair).ToList();
如果你需要一个 OR
例如,你必须将or'd过滤器定义为自己的预定义表达式*。
Expression<Func<Client, bool>> hasRedEyesOrBrownHair = c => c.Col1443 || c.Col1567 == "brown";
var query = Clients.Where(hasRedEyesOrBrownHair).ToList();
(*最后一点的替代方法是使用LINQKit这样的工具,比如: 或 手动使用 Expression
API。对于后者,你必须接受两个独立的条件,检索各个lambdas表达式的主体,使用表达式访问者替换其中一个表达式的参数来匹配另一个,然后调用 Expression.Or
最后 Expression.Lambda
来创建一个新的过滤器,你可以通过 Where
. 同样的概念也可以应用于and'ing,尽管这一切都变得有点棘手。)