gpt4 book ai didi

c# - Dynamic Linq 的执行延迟 IQueryable

转载 作者:行者123 更新时间:2023-12-02 03:42:59 28 4
gpt4 key购买 nike

我正在使用Dynamic Linq执行一些查询(抱歉,但这是我唯一的选择)。结果,我得到了 IQueryable而不是IQueryable<T> 。就我而言,我想要一个 IQueryable<Thing>哪里Thing是具体类型。

我的查询是这样的:

public IQueryable<Thing> Foo(MyContext db)
{
var rootQuery = db.People.Where(x => x.City != null && x.State != null);
var groupedQuery = rootQuery.GroupBy("new ( it.City, it.State )", "it", new []{"City", "State"});
var finalLogicalQuery = groupedQuery.Select("new ( Count() as TotalNumber, Key.City as City, Key.State as State )");
var executionDeferredResults = finalLogicalQuery.Take(10); // IQueryable

IQueryable<Thing> executionDeferredTypedThings = ??; // <--- Help here!!!!

return executionDeferredTypedThings;
}

我的东西.cs:

public class Thing
{
public int TotalNumber { get; set; }
public string City { get; set; }
public string State { get; set; }
}

是的,我知道上面的事情可以在没有 Dynamic Linq 的情况下完成,但我有一些可变性,我已经在这里简化了。如果我的返回类型只是 IQueryable 我可以让它与我的可变性一起工作但我不知道如何转换为 IQueryable<Thing>同时保持其执行延迟并同时保持 Entity Framework 满意。我确实有动态Select总是返回一些看起来类似 Thing 的东西(带有正确的数据) 。但我根本不知道如何返回 IQueryable<Thing>并在那里需要一些帮助。谢谢!!

尝试 1 失败

根据Rex M的建议,我现在正在尝试使用AutoMapper来解决这个问题(尽管我并不致力于这种方法并且愿意尝试其他方法)。对于 AutoMapper 方法,我是这样做的:

IQueryable<Thing> executionDeferredTypedThings = executionDeferredResults.ProjectTo<Thing>(); // <--- Help here!!!!

但这会导致 InvalidOperationException:

Missing map from DynamicClass2 to Thing. Create using Mapper.CreateMap.

问题是,虽然我已经定义了 Thing ,我还没有定义DynamicClass2因此,我无法映射它。

尝试 2 失败

IQueryable<Thing> executionDeferredTypedThings = db.People.Provider.CreateQuery<Thing>(executionDeferredResults.Expression);

这会产生 InvalidCastException,并且似乎与上述 AutoMapper 失败命中相同的根本问题:

Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery'1[DynamicClass2]' to type 'System.Linq.IQueryable'1[MyDtos.Thing]'.

最佳答案

您可以使用AutoMapper's Queryable Extensions生成一个包装底层 IQueryable 的 IQueryable,从而保留原始 IQueryable 的 IQueryProvider 和延迟执行,但将映射/转换组件添加到管道中以从一种类型转换为另一种类型。

还有AutoMapper's UseAsDataSource这使得一些常见的查询扩展场景变得更加容易。

关于c# - Dynamic Linq 的执行延迟 IQueryable<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098274/

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