gpt4 book ai didi

c# - 将 DbSet 转换为其 DbSet 而无需将所有实体拉入内存

转载 作者:太空狗 更新时间:2023-10-29 21:44:54 25 4
gpt4 key购买 nike

我的问题是我正在使用的系统期望数据为 IQuearable<IEntity> entityframework 给我的数据为 IQueryable<Entity>

这是我需要实现的接口(interface):

public IQueryable<T> GetData<T>() where T : class, IData {}

我有一个创建为 context.Set(MyEntityType) 的 DbSet,其中 MyEntityType 是 typeof(Entity)。

我现在已经尝试了一些事情,但不确定我将如何解决这个问题。 (它都是从 codedom 自动生成的代码,但在下面进行了测试以查看它是否可以工作,但还没有开始工作)

我做了一个测试包装器,问题就在这里LINQ to Entities only supports casting EDM primitive or enumeration types如果我能做到这一点,我就能让我的其他部分也能发挥作用。

public class DbSetWrapper<C1Data,Entity>
where C1Data : IData
where Entity: class
{

public DbSetWrapper(C1AzureStoreRPContext context)
{
Data = context.Set<Entity>().Cast<C1Data>();
}
public IQueryable<C1Data> Data { get; private set; }
}

public class C1AzureStoreRPContext : DbContext
{
static C1AzureStoreRPContext()
{
Database.SetInitializer<C1AzureStoreRPContext>(null);
}
// Methods
public C1AzureStoreRPContext(string connectionstring)
: base(connectionstring)
{

}

// Properties

public DbSet<AzureStoreSubscriptionWrapper> AzureStoreSubscriptions { get; set; }
}
public interface IAzureStoreSubscription : IData, IEntityFrameworkProvided {}
public class AzureStoreSubscriptionWrapper : AzureStoreSubscription, IAzureStoreSubscription { }

using (var c1 = new C1AzureStoreRPContext("opencms-sql-connection"))
{
var wrap = new DbSetWrapper<IAzureStoreSubscription, AzureStoreSubscriptionWrapper>(c1);
Log.LogInformation("EF", string.Format("hello {0}", wrap.Data.ToList().Count));
}

我不想把所有的数据拉到内存里做他们的转换,有没有其他的解决办法?

最佳答案

IQueryable<T>是协变的,所以不要尝试转换 DbSet<SubType>DbSet<SuperType> ,简单地分配:

Data = context.Set<Entity>(); // .AsQueryable() not needed but does make it more readable

这当然取决于Entity实现 C1Data ,根据您的通用类定义不能保证(这不好)。要解决此问题,请更改 Entity 的类型约束如下:

where Entity: C1Data

关于c# - 将 DbSet<Entity> 转换为其 DbSet<IEntity> 而无需将所有实体拉入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20299593/

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