gpt4 book ai didi

c# - 使用 Func 作为 LinqToEntities 的参数

转载 作者:行者123 更新时间:2023-11-30 20:30:35 25 4
gpt4 key购买 nike

我有一个 Linq 查询来获取我的 EF 数据。我的查询连接了 4 个表并将结果选择为非规范化类型。我将经常需要此查询,但使用不同的谓词。 List-ExtensionMethods(例如 .Where() 正在使用 Func<T,bool> 作为参数,我想做同样的事情 - 但我找不到在我的方法中访问我的谓词的方法。

public DenormalizedType GetData(Func<Thing, bool> predicate)
{
using (var dbContext = new MyDbContext())
{
var myData = (from some in dbContext.Thing
join other in dbContext.OtherThing
on some.OtherId equals other.Id
// => HowToWhere ???
select new DenormalizedType()
{
SomeEntry = some.Entry
SomeOtherId = some.OtherId
OtherValue = other.Value
}).ToList();
}
}

关于这个问题我有 3 个问题。

首先(显然):如何调用我的谓词以使用动态 where-clause?

第二:如果我最初的想法行不通(因为 teovankots 的回答表明,我的方法对 LinqToEntities 无效)是否有可能只创建一个连接方法?

第三:将我的结果返回到另一个软件组件的最佳性能方法是什么?

最佳答案

EF 查询提供程序需要将 LINQ 查询表达式树转换为 SQL,这在您传递 Func<...> 时是不可能的(更一般地说,调用表达式,如委托(delegate)、未知方法等)。

很快,Func<...> 无法满足您的要求类型参数。

使用 Queryable 时首先要考虑的事情方法是使用Expression<Func<...>>每当你使用 Func<..>Enumerable方法。所以像这样改变你的方法参数:

public DenormalizedType GetData(Expression<Func<Thing, bool>> predicate)

不幸的是,开箱即用不支持在 LINQ 查询语法中使用提供的表达式。为此,您需要一些表达式树处理库。

LINQKit 中解释了问题和可能的解决方案包页面。包提供的解决方案是通过AsExpandableInvoke自定义扩展方法。

安装 nuget package , 添加

using LinqKit;

到源代码文件,现在你可以使用类似这样的东西来实现目标:

public DenormalizedType GetData(Expression<Func<Thing, bool>> predicate)
{
using (var dbContext = new MyDbContext())
{
var myData = (from some in dbContext.Thing.AsExpandable() // <=
join other in dbContext.OtherThing
on some.OtherId equals other.Id
where predicate.Invoke(some) // <=
select new DenormalizedType()
{
SomeEntry = some.Entry
SomeOtherId = some.OtherId
OtherValue = other.Value
}).ToList();
}
}

关于c# - 使用 Func 作为 LinqToEntities 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44565612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com