是否可以在选择完成之前设置列别名,使用 Linq to SQL

Posted

技术标签:

【中文标题】是否可以在选择完成之前设置列别名,使用 Linq to SQL【英文标题】:Is it possible to set a column alias before a Select is done, with Linq to SQL 【发布时间】:2020-08-18 01:50:26 【问题描述】:

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

【问题讨论】:

可以使用部分FromSql吗? 设置HasRedEyes的[Column("Col1443")属性? 然后自己创建一个 DBML 文件,您只需在其中重命名所有列。连接到 Linqpad 中的 DBML。或者使用实体框架上下文。 @GertArnold 谢谢你,我会好好庆祝一下的。 【参考方案1】:

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

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

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

但请注意,只有在您通过连续调用*ANDWhere 时,它们才是可组合的:

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,尽管这有点棘手。)

【讨论】:

非常感谢!要试一试这些

以上是关于是否可以在选择完成之前设置列别名,使用 Linq to SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何为 MySQL 中的字段或列设置别名?

在同一选择中使用列别名[重复]

我用linq to sql查询,把结果显示到DataGridView中,但是我想在DataGridView中显示列的别名

如何在 laravel 查询生成器中为 sql 选择列添加别名?

如何在 Informix 数据库表中使用列别名

pyspark:使用别名选择列