Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 在LinqToSql中,对连接表中存储的父子关系建模的最佳方法是什么?_Linq To Sql - Fatal编程技术网

Linq to sql 在LinqToSql中,对连接表中存储的父子关系建模的最佳方法是什么?

Linq to sql 在LinqToSql中,对连接表中存储的父子关系建模的最佳方法是什么?,linq-to-sql,Linq To Sql,为了简化我目前的情况,让我们假设我有两个表(legacy,因此无法使用模式更好地使用Linq) 节点\u子节点类似于has\u,并且\u属于来自Rails的\u多个联接表。。。除了两个ID引用同一个表之外 理想情况下,我希望有一个节点类,它有一个属性Children,返回正确的列表? 结果应等同于 select * from node join node_children on node.key_field1 = node_children.child_key_field1 and node

为了简化我目前的情况,让我们假设我有两个表(legacy,因此无法使用模式更好地使用Linq)

节点\u子节点类似于has\u,并且\u属于来自Rails的\u多个联接表。。。除了两个ID引用同一个表之外

理想情况下,我希望有一个节点类,它有一个属性Children,返回正确的列表? 结果应等同于

select * from node 
join node_children 
on node.key_field1 = node_children.child_key_field1 and node.key_field2 = node_children.child_key_field2
where node_children.parent_key_field1 = @paramX and node_children.parent_key_field2 = @paramY

在Linq to Sql中对其建模的最佳方法是什么?

这是我提出的(也适用!)
打开ORM生成的节点类MyDatabase.cs

partial class Node
{
  public IEnumerable<Node> Children
  {
    get
    {
      MyDatabaseDataContext dc = new MyDatabaseDataContext();
      return from link in this.ChildLinks
          join node in dc.Nodes on new { Site = link.child_key_field1, ID = link.child_key_field2 } equals new { Site = node.key_field1, ID = node.key_field2 }
          select node;

    }
  }
}
部分类节点
{
可数儿童的公共教育
{
得到
{
MyDatabaseDataContext dc=新的MyDatabaseDataContext();
从这个链接返回。ChildLinks
在dc中加入节点。新{Site=link.child_key_field1,ID=link.child_key_field2}上的节点等于新{Site=node.key_field1,ID=node.key_field2}
选择节点;
}
}
}
  • ORM设计器会自动在两个表之间添加关联。我将Node类上的属性重命名为ChildLinks
  • (这让我激动了好几个小时)要让LINQ联接使用复合键,您需要匹配每个零件的名称和顺序。看
总有一天,我会完成LINQ入门系列文章:)

partial class Node
{
  public IEnumerable<Node> Children
  {
    get
    {
      MyDatabaseDataContext dc = new MyDatabaseDataContext();
      return from link in this.ChildLinks
          join node in dc.Nodes on new { Site = link.child_key_field1, ID = link.child_key_field2 } equals new { Site = node.key_field1, ID = node.key_field2 }
          select node;

    }
  }
}