问题标签 [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.

0 投票
2 回答
4625 浏览

c# - 当在成员属性上调用方法提供的表达式时,LinqKit System.InvalidCastException

给定一个简单的父/子类结构。我想使用 linqkit 在父级上应用子 lambda 表达式。我还希望 Lambda 表达式由实用程序方法提供。

上面的代码抛出

0 投票
2 回答
4684 浏览

c# - LinqKit 的扩展器无法从字段中获取表达式是否有特殊原因?

我正在使用允许动态组合表达式的 LinqKit库。

这对于编写 Entity Framewok 数据访问层来说是一种纯粹的幸福,因为可以选择重用和组合多个表达式,这使得代码既可读又高效。

考虑以下代码:

我们声明了一个Message投影到的表达式MessageView(为了清楚起见,我删除了细节)。

现在,数据访问代码可以使用这个表达式来获取单独的消息:

这很漂亮,因为同样的表达式也可以用于获取消息列表:

如您所见,投影表达式存储在_selectMessageViewExpr并用于构建几个不同的查询。

但是,我花了很多时间来跟踪一个奇怪的错误,即这段代码在call时崩溃了Expand()
错误说:

无法将类型的对象System.Linq.Expressions.FieldExpression转换为类型System.Linq.Expressions.LambdaExpression

过了一会儿,我才意识到当表达式在被调用之前在局部变量中引用时一切Invoke正常

代码按预期工作。

我的问题是:

InvokeLinqKit 无法识别存储在字段中的表达式是否有任何具体原因?这只是开发人员的遗漏,还是表达式需要首先存储在局部变量中的一些重要原因?

这个问题可能可以通过查看生成的代码和检查 LinqKit 源来回答,但是我想也许与 LinqKit 开发相关的人可以回答这个问题。

谢谢。

0 投票
1 回答
279 浏览

entity-framework-4 - 使用 PredicateBuilder 匹配部分单词

我正在使用 LinqKit 谓词生成器来查找记录。我需要和 Like %word% 一样匹配

p -> 是具有名字、姓氏等的客户类......

但是当我使用时:

我只得到完全匹配。如何更改代码以获得部分匹配(如果我寻找 dani,我想同时获得 "dani" 和 "daniel" )

谢谢。

0 投票
1 回答
597 浏览

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() 函数调用所有这些方法并加入它们:

这样我可以使查询工作,但我仍然不确定这是正确的方法。

0 投票
1 回答
2201 浏览

c# - 如何使用表达式> 在 Linq to EF 中的条件是什么?

已经有一些关于这个主题的问题(例如Expression.Invoke in Entity Framework?),但是,我找不到针对我的具体情况的答案。我想定义一个这样的方法:

AsExpandable 方法来自 LinqKit(正如前面提到的线程中所建议的那样)。但是,当我尝试像他一样调用我的方法时:

它抛出一个 InvalidCastException:

无法将“System.Linq.Expressions.InstanceMethodCallExpressionN”类型的对象转换为“System.Linq.Expressions.LambdaExpression”类型。我究竟做错了什么?

0 投票
1 回答
1634 浏览

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() 返回它,我似乎无能为力。有什么方法可以把我错过的这些放在一起吗?

0 投票
1 回答
1811 浏览

predicatebuilder - PredicateBuilder 和 或 或

在我为谓词构建器看到的所有示例中,它显示了一个起始表达式,PredicateBuilder.True如果您正在构建“and”表达式标准,并且PredicateBuilder.False如果您正在构建“or”表达式标准。

我的问题是,是否总是如此,如果是这样,为什么不能简单地推断出来。我怀疑在某些情况下,您正在构建“and”表达式并希望以 false 开头。而“或”的反义词

谁能给我解释一下?

0 投票
0 回答
696 浏览

linq - LinqKit 和过滤子查询

我有一个一对多关系(EF),我想编写一个过滤单关系并过滤多关系的查询。

例如:公司有很多员工

编写一个过滤 Company.Name = "ZonSoft" 的查询,其中 Company.Employees 至少有一个名为“Hesius”的员工

这工作正常,但如果过滤器在编译时未知怎么办?用户可以从许多过滤器(姓名、年龄……)中进行选择,我不想为此编写太多代码。

我正在尝试使用 Expression 和 linqkit,但我无法使过滤器对员工关系起作用。

'

如何在一个查询中组合这两个过滤器?或者我如何得到想要的结果?

这有效:'

我正在寻找这样的东西:

0 投票
1 回答
1226 浏览

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 将此表达式分解为单独的方法吗?如果是这样,怎么做?我究竟做错了什么?

0 投票
0 回答
540 浏览

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 数据上下文而不是内存中集合时,我没有收到此错误。:/