问题标签 [linq-expressions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1754 浏览

c# - 将 OrderBy 表达式与 Where 表达式结合

我发现以下可以组合多个Expression<Func<T,bool>>表达式的问题:

如何在没有调用的情况下合并两个 C# Lambda 表达式?

我想知道是否使用类似的技术将 .OrderByExpression<Func<Entity, Key>>与 .Where合并Expression<Func<Entity, bool>>到一个类型的表达式中,或者从类型继承,System.Linq.Expressions.Expression.

我正在制作一个非常精简的 QueryProvider 风格的类,用于T => T == ...通过公共方法.Where.OrderBy. 这是为了将此类构建的表达式传递给 QueryTranslator 以创建合适的 SQL。

这种风格的 QueryTranslator 在从 QueryProvider 调用时,通常将一个System.Linq.Expressions.Expression作为参数,然后将其转换为 SQL。

我可以理解并理解上述合并两个.WhereFuncs 的问题。以下博客文章对此特别有用,我跟踪了每个示例:

http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

这篇 CodeProject 文章也很有用:

http://www.codeproject.com/Articles/24255/Exploring-Lambda-Expression-in-C

但是,当将 .OrderBy Func 与 .Where Func 结合使用时,两者具有不同的通用参数。在 .Where 的情况下是 a Func<Entity, bool>,在 .OrderBy 的情况下是 a Func<Entity, Key>

从表面上看,合并这两个表达式并不像合并两个具有相同通用参数的表达式那么简单。

内置的 Func-Expression-production-engine(不确定确切的术语)能够将 .Where Func 与 .OrderBy Func 结合起来。当这两个表达式合并为一个时,我很好奇引擎盖下会发生什么System.Linq.Expressions.Expression。是否有可能,如果是这样,您将如何将 anExpression<Func<Entity, bool>>Expression<Func<Entity,Key>>假设 Entity 在每个表达式中的类型相同?

0 投票
2 回答
1662 浏览

c# - 如何使用 LINQ 从类型对象创建 lambda 表达式?

SetValue我正在尝试使用 LINQ 表达式加速反射-> 。

我的问题是这种方法:

我这样称呼:

问题是这一行:

因为 Action 使用泛型,我不能用field.FieldType...替换字符串

有没有可能我可以做到这一点而不必switch(field.FieldType)发表声明,并为每种可能的类型放置一个通用方法,这会浪费很多时间?

0 投票
2 回答
1020 浏览

.net - 使用 System.Linq.Expressions API 在 LINQ 中选择列

我正在尝试使用 LINQ 表达式从一个IEnumerable可以绑定到我的 UI 的结果集中动态选择列。在这一点上,我很难掌握 LINQ 表达式中投影的基础知识。

假设我有一个这样的字符串列表:

使用 lambda 表达式,我可以通过执行以下操作轻松选择字符串长度的集合:

该语句的结果将给我留下一个名为的集合,该集合myStringLengths具有元素3, 3, 5

我似乎无法弄清楚如何使用 LINQ 表达式产生等效结果。

编辑:当我说 LINQ 表达式时,我说的是在System.Linq.Expressions命名空间中使用 API,而不是 LINQ 语句或 lambda 表达式的标准形式。正如您在上面清楚地看到的那样,我已经熟悉如何以这种方式生成投影。

任何帮助是极大的赞赏。

0 投票
1 回答
1590 浏览

.net - 将 Expression.Call 与 Queryable.Select 一起使用,其类型仅在运行时已知

我正在尝试从IEnumerable集合中选择一个列,该列的类型在运行时只有我知道。我能想到的唯一方法是使用 LINQ 表达式来构建对Queryable.Select. 但是,我在找出完成此任务的正确语法时遇到了很多麻烦。

我将如何在编译时知道我需要的一切的快乐世界中执行此操作的示例,我的代码如下所示:

不幸的是,实际上我不知道我拥有的集合是 type String,或者我想要选择的属性是Length。我所拥有的是一个IEnumerable项目集合,以及一个PropertyInfo我想要选择的列,它为我提供了我需要的所有类型信息。

就表达式而言,我已经能够创建一个 LINQ 表达式,我相信它可以代表我通常会传递给 select 的 lambda(假设我正在尝试使用 String 和 String.Length 执行上述相同的操作)

现在希望剩下的就是构建对Queryable.Select. 对我来说,Expression.Call 的语法至少可以说相当混乱。我的尝试如下(失败,没有任何错误或任何解释):

我尝试以另一种方式执行此操作,而不使用 Type[] 参数并使用我的项目和属性的表达式无济于事:

问题是我现在几乎只是在猜测。然而,构建函数调用的整个想法、何时使用类型或表达式、使用哪些类型或表达式,或者甚至在哪里使用它们都令人困惑。任何帮助我到达那里的最后一部分并清除一些这个谜团将不胜感激。(我对 C# 中的示例非常满意)

0 投票
2 回答
803 浏览

c# - 从 linq 表达式中检索信息时是否使用反射?

我有以下扩展方法:

我在传递属性名称而不是字符串时使用 linq 表达式来提供强类型,我使用此函数将属性名称作为字符串检索。这种方法是否使用反射?

我问的原因是这种方法在我们的代码中被大量使用,我希望它足够快。

0 投票
1 回答
747 浏览

c# - LINQ:使用 AND 序列构建动态过滤器

我正在努力动态创建这样的查询:

其中 ReportDefinitions.Discriminants 是IDictionary<string, Guid>; 我知道如何构建简单的表达式,但我不知道如何构建这个“任何”似乎真的很复杂。任何电话都很难理解

任何人都知道如何处理这个?

0 投票
1 回答
317 浏览

.net - 使用 LINQ 表达式和 String.Format 进行字符串比较

我正在使用 LINQ 表达式动态搜索集合中的值,我遇到了一个奇怪的问题,这似乎是由搜索作为String.Format()操作结果的字符串引起的。

这是我正在尝试做的一个简化版本,因为在实践中我实际上并不知道我正在寻找什么类型的值,所以我必须将所有内容都视为Object.

这里发生的是标准方法正确返回 1,而 LINQ 表达式方法返回 0。但是,如果不使用 String.Format() ( myStrings.Add(stringToFind)) 将特殊值添加到集合中,则表达式也会返回正确结果.

String.Format() 是否会更改字符串的编码,或者会影响如何为字符串值创建常量表达式?有没有另一种方法可以使用 LINQ 表达式比较两个值来绕过这个限制?

0 投票
1 回答
545 浏览

asp.net-mvc - 如何将 Select 添加到现有的 Linq 表达式

我正在尝试制作一个可编辑的表格。我有一个动态表,可以使列可见或不可见。我有一个带有编辑按钮的额外列。当我点击它时,我会进行 Ajax 调用以获取该行的可编辑版本。

我的视图模型:

物品在哪里:

我有以下扩展来创建表格行:

从我的角度来看,这个函数是这样调用的:

EditorCellFor 方法签名:

我目前的问题是创建 selectCall。我想为 Lambda 表达式创建一个表达式:

我收到以下错误:

我在http://www.hanselman.com/blog/TheWeeklySourceCode47ASPNET35DynamicDataFilterRepeatersAndDynamicLinqQueryGeneration.aspx上看到的大部分代码。

我整个早上都在寻找这个问题,但到目前为止还没有运气。

0 投票
1 回答
555 浏览

c#-4.0 - 如何获取静态(编译时)类型的 IDynamicMetaObjectProvider?

我想在编译时类型的上下文/范围内执行动态表达式(由用户提供)。在下面的示例中,上下文是任意编译时类型的实例。为了创建评估范围,我想利用所有可用属性及其类型在编译时已知的事实。

我不想采取的解决方案是:

  1. 让上下文从 DynamicObject 继承并覆盖 GetMember(出于性能原因)
  2. 将上下文添加到范围并将表达式更改为“context.a + context.b”(出于可用性原因)

我敢肯定,已经有一种获取 IDynamicMetaObjectProvider 的机制,但无法弄清楚。

0 投票
3 回答
223 浏览

sql-server - 将 ObjectSet 限制为相关实体并按动态列名排序

给定一个父级和一个有效的列名,我想找到所有相关的子级,按动态列名排序。这是我认为我的代码的样子:

IEnumerable.OrderBy(string columnName) 不存在。环顾四周以完成“按动态列名排序”,我从这个看起来很棒的解决方案开始:如何为运行时排序创建表达式树?,但这在 IQueryable 上运行

如果是这样,我认为它会将记录通过网络进行排序并降低我的寻呼机的性能。所以我重新排序:

ObjectSet 和 ObjectQuery 实现 OrderBy(string columnName),并且此代码编译,但产生错误:

无法创建类型为“DataModel.Parent”的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

当然,我可以获取父ID,但是Child.ParentReference也是非原始类型。

我可以想到几种方法可以通过网络加载整个记录集,但我觉得我一定遗漏了一些东西,因为使用所有 MS 将一组基本指令传递到数据库一定不难以技术为中心。

编辑:假装我是http://en.wikipedia.org/wiki/Quiverfull,需要给我的孩子分页。:) edit2:澄清了我需要查询动态列名。