gpt4 book ai didi

c# - 使用 LINQ to Entities 将派生类转换为基类

转载 作者:太空狗 更新时间:2023-10-30 01:21:08 27 4
gpt4 key购买 nike

我有两个数据库表,一个用于保存已完成 项目,另一个用于保存未完成 项目。两个表的结构相同。在某些情况下,我只想查询这些表中的一个,但在其他情况下,我想查询两个表的串联。

public abstract class SomeBase
{
public int Id {set;get;}
public string Item1 {set;get;}
public string Item2 {set;get;}
}
public class A : SomeBase
{
}
public class B : SomeBase
{
}

映射(Fluent API)

public class SomeDatabase : DbContext
{
public DbSet<A> As {set;get;}
public DbSet<B> Bs {set;get;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<A>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("ATable", "SomeSchema");
}
modelBuilder.Entity<B>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("BTable", "SomeSchema");
}
}
}

使用此设置,我可以像这样单独查询两个表

var db = new SomeDatabase();
var a = db.As;
var b = db.Bs;

当试图将两者结合起来时,我不太明白语法。下面答案中的一个解决方案涉及使用 .AsEnumerable 对其进行转换,但这并不是我正在寻找的,因为它会立即评估。

db.As.AsEnumerable().Concat<SomeBase>(db.Bs);
db.As.Cast<SomeBase>().Concat(db.Bs.Cast<SomeBase>());

如何连接数据库站点上相同的两个派生类?

编辑:在最低级别,我遇到了这些错误

db.As.Cast<SomeBase>();
Unable to cast the type 'Test.Models.A' to type 'Test.Models.SomeBase'. LINQ to Entities only supports casting Entity Data Model primitive types.

db.As.OfType<SomeBase>();
'Test.Models.SomeBase' is not a valid metadata type for type filtering operations. Type filtering is only valid on entity types and complex types.

相关问题:How to combine 2different IQueryable/List/Collection with same base class? LINQ Union and Covariance issues

最佳答案

简单定义一个

DbSet<SomeBase> Bases { get; set;}

属性访问基类的所有实例。该框架应该以正确的方式(并集)组合查询,以包括来自两个表的实例。

有关更多详细信息,请查看例如本文:http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx

(你使用TPC继承策略)

关于c# - 使用 LINQ to Entities 将派生类转换为基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16597194/

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