2013-07-17 52 views
2

我有一个表:Material(ID,Name,MAterialParentID)如何转换SQL左连接查询Linq到C#中的实体?

SELECT c1.ID,c1.Name as ParentName,c2.id,c2.Name 
FROM Material c1 Left JOIN Material c2 
ON  c1.ID = c2.MaterialParentID 

ID ParentName id Name 
1 Aluminium 2 Cavity 
1 Aluminium 3 Copper 
1 Aluminium 4 Flooring 
2 Cavity  NULL NULL 
3 Copper  NULL NULL 
4 Flooring NULL NULL 
5 Glass  NULL NULL 

我想使用的Liq到实体上述SQL Query转换为Linq Query

帮助赞赏!

+0

@Mthethew在导航属性上使用'Include',而不是外键本身。 –

+0

是的,现在不幸编辑太晚了。 – Matthew

回答

1

如果表格仅用于阅读,您可以简单地创建一个视图,然后在使用逆向工程时确保导入了视图。

,或者如果你确实想在LINQ完成这件事这里是MSDN例如

var innerJoinQuery = 
    from cust in customers 
    join dist in distributors on cust.City equals dist.City 
    select new { CustomerName = cust.Name, DistributorName = dist.Name }; 

这是你会怎样看

var Material = from M in db.Materials 
         join M2 in db.Materials on M.ID equals M2.MaterialParentID 
         select new {ParentID = M.ID, ParentName = M.Name, M2.ID, M2.Name }; 

我编辑了我的职位上面,你可以看到我有包括ParentID以使所有列独一无二

+0

hello @Luke Franklin,我在你的回答行中编辑了你的查询并在我的程序中使用。但它显示错误:“匿名类型无法在M2.ID中具有多个同名的属性'!如何解决它?任何想法? –

+1

这是因为您将获得值的方式将是materials.id,并且将有2 id在m.id.的开头写入Parentid = m.id –

0

对于这种问题linqpad是你的朋友。

我建议是这样的:

var materials = (from m in context.Material 
       let moreMaterials = (from m2 in context.Material where m2.id == m.id select m2).FirstOrDefault() 
       select m).ToList(); 

但是你可以用linqpad来定制您的查询需求。