- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个动态查询,它可以有 n 的 Where
方法调用和 n 的 SelectMany
调用取决于用户输入。例如我可能有:
var qZ = entityContext.TableA
.SelectMany(a=>a.TableB, (a,t)=>new{a,t} )
.Where(a=>a.t.FieldID==21)
.Where(a=> EntityFunctions.Left(a.t.Value,1)=="p")
.SelectMany(a=>a.a.TableC, (a,t)=>new{a,t} )
.Where(a=>a.t.FieldID==22)
.Where(a=> a.a.t.Value=="Peter" && a.t.Value=="Pan")
.Where(a=> a.a.a.TypeID==3)
.Select(a=> new{ a.a.a.ItemID }
).Distinct();
在我编写的方法中,我使用返回 IQueryable
的辅助方法,如下面的返回行所示。
return query.Provider.CreateQuery(
Expression.Call(typeof(Queryable),
"Where",
new Type[] {query.ElementType},
query.Expression, predicateLambda)
);
我能够为所有需要的各种查询属性-值 对创建 LambdaExpressions,但我无法为 的
.resultSelector
创建一个Queryable.SelectMany
我们如何在表达式树中创建 (a,t) => new{a=a, t=t}
?或者我们如何使用如下所示的 Expression.Call 实现与上面的 .SelectMany 相同的结果?
Expression.Call(typeof(Queryable),
"SelectMany",
????????,
????????
);
我已经尝试使用不需要 resultSelector
的 SelectMany
重载,它在某种程度上起作用,但是,我不知道如何引用属性后续方法调用中的 t。
我发现这个 lambda 表达式 ((a,t) => new{a=a, t=t}
) 在整个网络上都与 SelectMany
相关联,但我找不到任何有关如何将其转换为表达式树的示例。
更新:让我们重新定义问题。我可以像这样传递 lambda
var q = entityContext.TableA.AsQueryable();
var q1 = Queryable.SelectMany(q, a => a.TableB, (a, t) => new { a = a, t = t });
var q2 = Queryable.Where(q1,a=>a.t.FieldID==22);
然而,这是有效的,因为我不知道提前需要调用多少 SelectMany,并且由于每次调用都更改为 IQueriable 的匿名类型,是否有一种方法可以转换(和重新转换)匿名类型键入单个变量?这样我就可以循环遍历并将任何必要的方法应用于变量,然后在构建查询后枚举以获取结果。像这样的东西:
var q = entityContext.TableA..AsQueryable();
q = Queryable.SelectMany(q, a => a.TableB, (a, t) => new { a = a, t = t });
q = Queryable.Where(q,a=>a.t.FieldID==22);
(顺便说一句:这行不通)
最佳答案
我最终解决这个问题的方式需要范式转变。上面的第一个查询是基于这样一个事实,即我学会了通过将我需要的所有表连接在一起来编写查询,以便我可以访问过滤和选择这些表中的字段。
SelectMany() 创建连接,当时我的想法周围的框要求如果我需要过滤表中的特定列,我必须将该表连接到我的查询。这反过来又改变了我的 IQueryable 的类型,导致我无法在设计时预测 IQueryable 的类型。
回答:
第 1 步:将 IQueryable 的类型设置为其需要返回的输出类型。在上面的例子中,结果总是 IQueryable。
第 2 步:利用表达式动态创建 WHERE 谓词,包括创建适当过滤器所需的任何和所有表。这总是返回 Expression> 和我们很容易解释的所有其他变量。请记住,在 EF 中,如果仅在 Where() 中需要它们,则无需在 Where() 外部加入表。
关于c# - 如何创建为 SelectMany resultSelector 返回匿名类型的 C# LambdaExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669139/
这个问题已经有答案了: Difference Between Select and SelectMany (21 个回答) 已关闭 5 年前。 我遇到了 SelectMany 表达式的问题,我无法理解
此查询返回员工 ID、姓名、公司 ID、公司名称和公司城市。我缺少员工电子邮件地址(emailAddress 存储在 EmployeeEmailAddress 表中)和员工电话号码(phoneNumb
文章中Deep Dive into Rx SelectMany作者在最后的注释中提到了以下内容; Note: To mitigate the ordering issue, SelectMany()
我正在解析 XML 结构,我的类如下所示: class MyXml { //... List Content { get; set; } //... } class Node
我在用户组中有动态字段,我想根据用户组中的用户来选择它们。 基本上我想模拟像 .Where(x => x.UserGroupId == x || ... 这样的查询,否则它会进行大约 20 个查询来获
您好,我正在通过 MS 101 linq 示例编写代码。 “JoinOperators”给我带来了困难,因为我试图将查询表达式重构为 lambda 语法,反之亦然。 无论如何,在例子105我看到这个查
如果没有输入和输出,很难解释这一点。我制作了一个简单的汽车示例,以避免我的项目出现不必要的细节。 我有这个列表: List cars = new List() { new car() { ca
所以我有这些部分类。有关 ParseFCIE 的部分实现和我的问题,请参见下文。 class CiscoSwitch { Dictionary VSANList = new Dictionar
众所周知,Enumerable.SelectMany将一系列序列展平为单个序列。如果我们想要一种可以压平序列序列序列的序列的方法,等等递归怎么办? 我很快想出了一个使用 ICollection 的实现
这个问题在这里已经有了答案: SelectMany() Cannot Infer Type Argument -- Why Not? (1 个回答) 关闭 7 年前。 当我尝试编译我的代码时出现以下
我正在使用 NUnit、Moq 和 StructureMap。 我有以下 NUnit 测试: [Test] public void ShouldCallCustomMethod_For
我已经尝试了很长时间来寻找一种“干净”的模式来处理具有匿名类型的 .SelectMany,当您并不总是希望返回结果时。我最常见的用例如下所示: 我们有一份客户名单,我想对其进行报告。 每个客户的数据都
假设我有以下通用组合生成器静态方法: public static IEnumerable> GetAllPossibleCombos( IEnumerable> items) { IE
我可以使用 SelectMany 展平集合中子集合的结果: // a list of Foos, a Foo contains a List of Bars var source = new Li
基本上,我想做的是左外连接两个表并将它们呈现在一个平面结果中。为简单起见,我的两个表如下所示: tot["nameA", "nameB", "nameC"] critItg["nameA", "nam
如何以另一个 .SelectMany() 形式编写此 LINQ 表达式? var result = from a in numbersA
我目前正在查询如下字典, foreach (var instance in Dict) { X += $"(Description = '{instance.Key}') OR "; } 我可以
仅使用扩展方法应用 SelectMany 获得三个或更多序列的交叉连接的最佳方法是什么?有没有其他方法可以实现交叉连接? 测试数据 var a = Enumerable.Range(11, 2); v
我正在使用 Nancy 和 RavenDB 构建一个照片库我的模型类如下: [JsonObject(IsReference=true)] public class Album { public
我想知道如何使用SelectMany()。这似乎需要很多争论,从我自己的研究中我注意到 SelectMany() 可能是所有其他选择操作的“父亲”。 最佳答案 选择多个允许您从查询源中选择一个 IEn
我是一名优秀的程序员,十分优秀!