问题标签 [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
正常:
此代码按预期工作。
我的问题是:
Invoke
LinqKit 无法识别存储在字段中的表达式是否有任何具体原因?这只是开发人员的遗漏,还是表达式需要首先存储在局部变量中的一些重要原因?
这个问题可能可以通过查看生成的代码和检查 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 应该只匹配。)OfficialName
term
PlaceName
Text
AsciiEquivalent
term
Language
PlaceName
CultureInfo.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 数据上下文而不是内存中集合时,我没有收到此错误。:/