问题标签 [linqkit]
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.
c# - 当在成员属性上调用方法提供的表达式时,LinqKit System.InvalidCastException
给定一个简单的父/子类结构。我想使用 linqkit 在父级上应用子 lambda 表达式。我还希望 Lambda 表达式由实用程序方法提供。
上面的代码抛出
c# - LinqKit 的扩展器无法从字段中获取表达式是否有特殊原因?
我正在使用允许动态组合表达式的 LinqKit库。
这对于编写 Entity Framewok 数据访问层来说是一种纯粹的幸福,因为可以选择重用和组合多个表达式,这使得代码既可读又高效。
考虑以下代码:
我们声明了一个Message投影到的表达式MessageView(为了清楚起见,我删除了细节)。
现在,数据访问代码可以使用这个表达式来获取单独的消息:
这很漂亮,因为同样的表达式也可以用于获取消息列表:
如您所见,投影表达式存储在_selectMessageViewExpr并用于构建几个不同的查询。
但是,我花了很多时间来跟踪一个奇怪的错误,即这段代码在call时崩溃了Expand()。
错误说:
无法将类型的对象
System.Linq.Expressions.FieldExpression转换为类型System.Linq.Expressions.LambdaExpression。
过了一会儿,我才意识到当表达式在被调用之前在局部变量中引用时一切Invoke正常:
此代码按预期工作。
我的问题是:
InvokeLinqKit 无法识别存储在字段中的表达式是否有任何具体原因?这只是开发人员的遗漏,还是表达式需要首先存储在局部变量中的一些重要原因?
这个问题可能可以通过查看生成的代码和检查 LinqKit 源来回答,但是我想也许与 LinqKit 开发相关的人可以回答这个问题。
谢谢。
entity-framework-4 - 使用 PredicateBuilder 匹配部分单词
我正在使用 LinqKit 谓词生成器来查找记录。我需要和 Like %word% 一样匹配
p -> 是具有名字、姓氏等的客户类......
但是当我使用时:
我只得到完全匹配。如何更改代码以获得部分匹配(如果我寻找 dani,我想同时获得 "dani" 和 "daniel" )
谢谢。
linq - 实体框架:混合实体的混合谓词
对不起我糟糕的英语。
我正在尝试扩展我的 EF 模型(使用 LinqKit)。
只要我使用单个实体表达式,我就没有任何问题,但是如果我想使用混合表达式,我就会被卡住。
例如,像这样的一类帖子......
...使用表达式 HasMetas 扩展实体“vit_post”。
使用这个片段,我得到了实体的一个子集,正如预期的那样:
但是,如果我尝试将此表达式移动到像这样的“vit_postmeta”实体:
我的想法是将原始方法保留在 vit_post 中并像这样进行更改:
但我不能这样做,因为“'vit_postmeta' 不包含'HasMetas' 的定义,并且找不到接受'vit_postmeta' 类型的第一个参数的扩展方法'HasMetas'”。
我错过了一些东西,我知道,但我找不到什么。
更新
我找到了一种替代解决方案(也许也是正确的解决方案),在各自的实体部分类中实现我的所有表达式。例如, vit_post 具有与 vit_posts 表相关的所有表达式,而 vit_postmeta 具有与 vit_postmeta 表相关的所有表达式。
然后,我的 Search 类对每个实体都有一个私有方法。就像是:
然后 GetResults() 函数调用所有这些方法并加入它们:
这样我可以使查询工作,但我仍然不确定这是正确的方法。
c# - 如何使用表达式> 在 Linq to EF 中的条件是什么?
已经有一些关于这个主题的问题(例如Expression.Invoke in Entity Framework?),但是,我找不到针对我的具体情况的答案。我想定义一个这样的方法:
AsExpandable 方法来自 LinqKit(正如前面提到的线程中所建议的那样)。但是,当我尝试像他一样调用我的方法时:
它抛出一个 InvalidCastException:
无法将“System.Linq.Expressions.InstanceMethodCallExpressionN”类型的对象转换为“System.Linq.Expressions.LambdaExpression”类型。我究竟做错了什么?
linq - 可查询的使用 EntityObject 使用泛型和接口(可能吗?)
我有一个使用具有以下搜索功能的 LinqKit 的 EntityFramework 4.0 搜索存储库:
另一个类使用 IQueryable 返回值以使用 Boolean LinqKit PredicateBuilder 表达式无法实现的方式对查询进行子集化:
这里的问题是 'T' as EntityObject 没有定义 GUID,所以我不能使用它。对此的自然反应是实际定义 SubsetByUser() 方法以使用具有 GUID 属性的约束:
但这不起作用。我正在使用 LinqKit 和 Expandable() 方法导致:
我需要返回一个 IQueryable。我可以做一个这样的假:
当然,这很有效,但当然,这也是一件非常疯狂的事情。(我想要 IQueryable 的全部原因是在我们完成之前不执行查询。
我什至试过这个:
它使用反射来获取 Runs 集合——解决编译器错误。我认为这很聪明,但它会导致 LINQ 异常:
我也可以尝试更改搜索方法:
但这当然不会编译,因为 IRunElement 不是 EntityObject,并且 ObjectSet 将 T 约束为一个类。
最后一种可能性是简单地将所有参数和返回值设为 IEnumerable:
这也有效,但是这又一次不允许我们将实例化延迟到最后。
因此,如果不将所有内容实例化为 IEnumerable 然后使用 AsQueryable() 返回它,我似乎无能为力。有什么方法可以把我错过的这些放在一起吗?
predicatebuilder - PredicateBuilder 和 或 或
在我为谓词构建器看到的所有示例中,它显示了一个起始表达式,PredicateBuilder.True如果您正在构建“and”表达式标准,并且PredicateBuilder.False如果您正在构建“or”表达式标准。
我的问题是,是否总是如此,如果是这样,为什么不能简单地推断出来。我怀疑在某些情况下,您正在构建“and”表达式并希望以 false 开头。而“或”的反义词
谁能给我解释一下?
linq - LinqKit 和过滤子查询
我有一个一对多关系(EF),我想编写一个过滤单关系并过滤多关系的查询。
例如:公司有很多员工
编写一个过滤 Company.Name = "ZonSoft" 的查询,其中 Company.Employees 至少有一个名为“Hesius”的员工
这工作正常,但如果过滤器在编译时未知怎么办?用户可以从许多过滤器(姓名、年龄……)中进行选择,我不想为此编写太多代码。
我正在尝试使用 Expression 和 linqkit,但我无法使过滤器对员工关系起作用。
'
如何在一个查询中组合这两个过滤器?或者我如何得到想要的结果?
这有效:'
我正在寻找这样的东西:
entity-framework-4 - 无法使用 LINQ to Entities 和 LinqKit / PredicateBuilder 重构
我一直在尝试将 LINQ 表达式重构为方法,并且遇到了“ Internal .NET Framework Data Provider error 1025.”和“ The parameter 'xyz' was not bound in the specified LINQ to Entities query expression.”异常。
以下是实体模型的相关部分(使用 EF 4.2 / LINQ to Entities):
基本的关系模型是这样的:
我正在尝试创建一个查询,当给定 search 时,它将term尝试查找以OR开头的Place实体,其具有who或以 search 开头。(不是我遇到问题的地方,尽管它是查询的一部分,因为s 应该只匹配。)OfficialNametermPlaceNameTextAsciiEquivalenttermLanguagePlaceNameCultureInfo.CurrentUICulture.TwoLetterIsoLanguageName
以下代码确实有效:
我接下来要做的是重构NonOfficialNameMatches方法以将name => ...表达式提取到单独的方法中,以便其他查询可以重用它。这是我尝试过的一个示例,它不起作用并引发异常“ The parameter 'place' was not bound in the specified LINQ to Entities query expression.”:
当我没有.AsExpandable()链时NonOfficialNameMatches,我会得到“ Internal .NET Framework Data Provider error 1025.”异常。
我在这里遵循了其他建议,例如调用.Expand()谓词的几种组合,但总是以上述异常之一结束。
甚至可以使用带有 LinqKit / PredicateBuilder 的 LINQ to Entities 将此表达式分解为单独的方法吗?如果是这样,怎么做?我究竟做错了什么?
c# - 使用带有表达式方法的 linqkit 谓词时出错
一点背景知识:
我正在使用不支持某些操作的 Linq 提供程序(MsCrm2011 Linq 提供程序,但并不重要)。
具体来说,它不支持Contains()在表达式内部。
含义-这样的事情不起作用:var users = DataContext.Users.Where(user => userIds.Contains(user.Id)).
我找到的解决方案是使用LinqKit的谓词,所以userIds.Contains(...)我将拥有user.Id == userIds[0] || user.Id == userIds[1] ... || user.Id == userIds[100].
为此,我定义了以下函数,它接受任意集合和任意表达式,并对它们应用“或”:
这样,我可以使用任何一种集合和任何一种表达方式。
例如,查看此测试运行(使用内存中的用户集合):var res = FilterByCollection(users.AsQueryable(), rolesList, (account, role) => account.Role == role)查找具有给定角色之一的所有用户。
但是,当我运行上面的示例时,我遇到了以下异常 - variable 'entity' of type 'User' referenced from scope '', but it is not defined。
有任何想法吗?
PS 不确定这有多相关,但是当我实际使用 Crm 数据上下文而不是内存中集合时,我没有收到此错误。:/