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

Is it possible to set a column alias before a Select is done, with Linq to SQL

我是 c# 新手,正在使用 Linqpad 中的 Linq To SQL 从数据库中获取数据。在我的数据库中,由于遗留原因,我有很多列,名称为 Col1、Col2、Col3 等。

目前我必须记住哪个列引用了哪个值,以便我能够提取数据。

不必写:

Clients.Where(c => c.Col1443 == true)

我希望能够执行以下操作:

var HasRedEyes= "Col1443";
Clients.Where(c => c.HasRedEyes == true)

请注意,我需要将此翻译成 SQL,因为我需要从数据库中获取此数据,此数据未本地化。

你真的应该想办法 A. 重命名你的列和 B. 减少它们的数量(1,000+ 有点多)。自从我使用 LINQ to SQL 以来已经有一段时间了,但是如果您需要的只是查询能力,那么您可以定义一个带有别名的列的视图吗?

除此之外,解决此问题的一种方法是定义代表预定义过滤器的命名表达式。例如,假设 class 被命名为 Client:

Expression<Func<Client, bool>> hasRedEyes = c => c.Col1443; // == true is implicit
var query = Clients.Where(hasRedRyes).ToList();

但请注意,只有当您通过对 Where 的连续调用* AND 它们时,它们才可组合:

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 过滤器定义为它自己的预定义表达式*,例如:

Expression<Func<Client, bool>> hasRedEyesOrBrownHair = c => c.Col1443 || c.Col1567 == "brown";
var query = Clients.Where(hasRedEyesOrBrownHair).ToList();

(* 最后一位的替代方法是使用像 LINQKit 这样的工具来手动使用 Expression API。后者你必须采取两个单独的条件,检索各个 lambda 表达式的主体,使用表达式访问者替换其中一个的参数以匹配另一个,调用 Expression.Or 最后 Expression.Lambda 来创建一个可以传递给 Where 的新过滤器。同样的概念也可以应用于 and'ing,尽管它有点棘手。)