是否可以在完成Select之前,用Linq to SQL设置列别名。

问题描述 投票:0回答:1

我是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,因为我需要从数据库中获取这些数据,这些数据不是本地化的。

c# sql-server linq-to-sql linqpad
1个回答
1
投票

你真的应该想办法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,尽管这一切都变得有点棘手。)

© www.soinside.com 2019 - 2024. All rights reserved.