c# - 是否可以在选择完成之前设置列别名,使用 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,因为我需要从数据库中获取此数据,此数据未本地化。
解决方案
您确实应该找到一种方法来 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 之类的工具或手动使用Expression
API。对于后者,您必须采用两个单独的条件,检索各个 lambdas 表达式的主体,使用表达式访问者替换其中一个的参数以匹配另一个,调用Expression.Or
并最终Expression.Lambda
创建一个可以传递给的新过滤器Where
。同样的概念也可以应用于 and'ing,尽管这有点棘手。)
推荐阅读
- python - 根据python脚本中的新值替换常量值并更新其他值
- amazon-web-services - CloudFormation 从 API Gateway 发回 Lambda 响应
- r - modelsummary 的 modelplot() 图中的 UTF-8 和 unicode
- linux - Hangfire 作业应该在中午 12 点到晚上 9 点之间每小时运行一次
- c++ - 为什么这个面向对象的 OpenGL 代码不会绘制一个三角形,而扩展版本却可以呢?
- go - 在 Redis DB 中保存 1000 万条记录的瓶颈
- react-native - 反应原生分页
- python - 如何在 tkinter 中隐藏带有复选框的小部件
- android - 在 Activity 中检索协程广播消息时出现问题
- flutter - 视频无法在颤振 Web 应用程序中播放