2011-10-22 20 views
10

我有两个表,Table1Table2。我想执行,比方说,一个左外连接:在LINQ中加入JOIN后选择所有列

var myOutput = from object1 in Table1 
       join object2 in Table2 
       on object1.Property1 equals object2.Property2 into Table3 
       from output in Table3.DefaultIfEmpty() 
       select new 
        { 
         object1.Property1, 
         object1.Property2, 
         //... 
         output.Property3, 
         output.Property4, 
         //... 
        }; 

正如你可以看到,我想选择从结果表两个对象的所有属性(而加盟被认为是可枚举包含某些类型的对象 - 这两种关系都不同)。当然,我可以选择匿名选择中的属性,如示例中所示。

我的问题是如何避免手动指定所有属性?我想有类似SELECT * FROM TABLE3,其中TABLE3是一个结果关系(加入TABLE1TABLE2后)。

在此先感谢您的线索。

回答

10

如果要投影到展平类型,则必须手动指定每个参数。你的另一种选择是让你的组合类型包含两个对象,并且这些对象自然会带来它们的属性。

select new 
{ 
    Object1 = object1, 
    Object2 = output 
}; 

你会使用它像myObj.Object1.Property1myObj.Object2.Property4

仍涉及一些手工作业的最后一个选项是定义一个适当的类型,并有一个构造函数,或者做的建设者方法把你的对象属性分割成扁平类型的工作。您仍然执行手动映射,但将其与查询逻辑隔离。

select new CombinedType(object1, output); 
//or 
select builder.GetCombinedType(object1, output); 
+0

不是第一个选项在赋值过程中使用ToString()方法吗?在这种情况下,我会在执行myOutput.ToArray()之后在名为Object1的列中获得“Namespace.MyType”值... – Jamie

+0

不,它不会调用ToString(),是什么让你知道它会?你是否将它绑定到某种UI控件? * control *可能调用'ToString()',但查询本身是真实的,只是使用整个对象并将其映射到一个属性。 –

+0

你的评论给了我一个想法 - 我做了一个包含两个对象的引用的新类。然后很容易绑定到这些的某些属性:) – Jamie