首页 > 解决方案 > 是否可以在选择完成之前设置列别名,使用 Linq to SQL

问题描述

我是 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-serverlinq-to-sqllinqpad

解决方案


您确实应该找到一种方法来 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();

但请注意,只有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 之类的工具手动使用ExpressionAPI。对于后者,您必须采用两个单独的条件,检索各个 lambdas 表达式的主体,使用表达式访问者替换其中一个的参数以匹配另一个,调用Expression.Or并最终Expression.Lambda创建一个可以传递给的新过滤器Where。同样的概念也可以应用于 and'ing,尽管这有点棘手。)


推荐阅读