C# Linq将多个表转换为一个具有嵌套类的继承类
我有一个SQL表,但客户删除了所有外键,不让我用所有外键重建表 我在数据库优先的方法中使用了实体框架,我得到了如下结果:C# Linq将多个表转换为一个具有嵌套类的继承类,c#,linq,nested,entity-framework-6,C#,Linq,Nested,Entity Framework 6,我有一个SQL表,但客户删除了所有外键,不让我用所有外键重建表 我在数据库优先的方法中使用了实体框架,我得到了如下结果: public class MainTable { MainTableID, TableChildOneID, TableChildTwoID, //... many properties } public class TableChildOne { TableChildOneID, //... many properties
public class MainTable
{
MainTableID,
TableChildOneID,
TableChildTwoID,
//... many properties
}
public class TableChildOne
{
TableChildOneID,
//... many properties
}
public class TableChildTwo
{
TableChildTwoID,
//... many properties
}
我创建了一个表示“真实”链接嵌套类的类,如:
public class MainTable_Extended : MainTable
{
public TableChildOne ChildOne { get; set; }
public TableChildTwo ChildTwo { get; set; }
}
请注意,MainTable包含许多属性
这里是我要寻找干净语法的查询
IQueryable<MainTable_Extended> listMainTable =
from main in db.MainTable
from childone in db.TableChildOne.Where(childone => childone.TableChildOneID == main.TableChildOneID).DefaultIfEmpty()
from childtwo in db.TableChildTwo.Where(childtwo => childtwo.TableChildTwoID == main.TableChildTwoID).DefaultIfEmpty()
select new MainTable_Extended
{
ChildOne = childone ,
ChildTwo = childtwo ,
All others properties coming from => main
};
IQueryable listMainTable=
从db.main表中的main
从db.TableChildOne.Where(childone=>childone.TableChildOneID==main.TableChildOneID.DefaultIfEmpty()中的childone
从db.TableChildTwo.Where(childtwo=>childtwo.TableChildTwoID==main.TableChildTwoID.DefaultIfEmpty()中的childtwo
选择新的MainTable\u Extended
{
ChildOne=ChildOne,
ChildTwo=ChildTwo,
来自=>main的所有其他属性
};
我如何填充我的类MainTable\u Extended,而不手动填充所有属性。也许这对您有用
public class MainTable
{
public int MainTableID;
public int TableChildOneID;
public int TableChildTwoID;
//... many properties
}
public class TableChildOne
{
public int TableChildOneID;
//... many properties
}
public class TableChildTwo
{
public int TableChildTwoID;
//... many properties
}
public class MainTable_Extended
{
public TableChildOne ChildOne { get; set; }
public TableChildTwo ChildTwo { get; set; }
public MainTable Main { get; set; }
}
public class DB : DbContext
{
public DB()
: base("name=YourName")
{}
public virtual DbSet<MainTable> MainTables { get; set; }
public virtual DbSet<TableChildOne> TableChildOnes { get; set; }
public virtual DbSet<TableChildTwo> TableChildTwos { get; set; }
}
public class Test
{
public void TestTest()
{
var db = new DB();
IQueryable<MainTable_Extended> listMainTable =
from main in db.MainTables
from childone in db.TableChildOnes.Where(childone => childone.TableChildOneID == main.TableChildOneID).DefaultIfEmpty()
from childtwo in db.TableChildTwos.Where(childtwo => childtwo.TableChildTwoID == main.TableChildTwoID).DefaultIfEmpty()
select new MainTable_Extended
{
ChildOne = childone,
ChildTwo = childtwo,
Main = main
};
}
}
公共类主表
{
公共int MainTableID;
公共int表childoneid;
公共int表childtwoid;
//…许多财产
}
公共类表Childone
{
公共int表childoneid;
//…许多财产
}
公共课表二
{
公共int表childtwoid;
//…许多财产
}
公共类MainTable_扩展
{
公共表ChildOne ChildOne{get;set;}
公共表ChildTwo ChildTwo{get;set;}
公共主表Main{get;set;}
}
公共类DB:DbContext
{
公共数据库()
:base(“name=YourName”)
{}
公共虚拟数据库集主表{get;set;}
公共虚拟DbSet tablechildone{get;set;}
公共虚拟数据库集TableChildTwos{get;set;}
}
公开课考试
{
公共void TestTest()
{
var db=新的db();
IQueryable listMainTable=
从db.main表中的main
从db.TableChildOnes.Where(childone=>childone.TableChildOneID==main.TableChildOneID.DefaultIfEmpty()中的childone
从db.TableChildTwos.Where(childtwo=>childtwo.TableChildTwoID==main.TableChildTwoID.DefaultIfEmpty()中的childtwo
选择新的MainTable\u Extended
{
ChildOne=ChildOne,
ChildTwo=ChildTwo,
主要的
};
}
}
我让MainTable\u扩展类
不在MainTable类
之内。相反,我使用MainTable对象创建一个属性。因此在查询中,我给MainTable\u Extended
属性一个值
因此,不,您可以通过调用
MainTable\u Extended
的属性Main
来查询MainTable的属性?你需要告诉它,如果你不能通过DB模式做到这一点,那么你必须手动完成。我认为一个连接比三个“from”更好因为我想要一个LEFT-OUTTER连接,而使用连接似乎可以实现内部连接JOIN@HassanN所以你的问题是你想让属性形成MainTable_扩展类?基本上我有三个表没有被EF链接,我想用left outter查询MainTable连接两个子表,并将结果填充到一个类中Hierarchy请解释为什么这会帮助OP,如果你不说出你的想法和你为什么这样做,这对他没有帮助。@JordyvanEijk是的,你是对的。那是我的错,谢谢你的通知!嗨,Darem,它目前的工作方式就像你做的一样,我想问一下,如果有人知道如何使用它inherit@HassanN好的,对不起,我不能help@Darem不用担心,我会等待,如果没有答案,我会接受这个解决办法