LINQ中JOIN之后选择所有列

10

我有两个表,Table1Table2。我想执行一个左外连接:

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 连接而成)。

提前感谢您的提示。

1个回答

10

如果您想将投影映射到扁平化类型中,则必须手动指定每个。另一种选择是让您的组合类型包含两个对象,这样对象自然会带上它们的属性。

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

你可以像这样使用它:myObj.Object1.Property1myObj.Object2.Property4等。

最后还有一种选项需要一些手动操作,就是定义一个适当的类型,并拥有一个构造函数或者一个生成器方法去将你的对象属性分割成一个扁平化的类型。虽然你仍需要手动映射,但是你能够将其与查询逻辑隔离开来。

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

第一个选项在赋值过程中使用了ToString()方法,对吗?如果是这样的话,在执行myOutput.ToArray()后,我将在名为Object1的列中得到"Namespace.MyType"等值... - Jamie
不会调用 ToString(),你怎么想到它会呢?你将其绑定到某种 UI 控件上了吗?控件 可能会调用 ToString(),但查询本身是真实的,它只是使用整个对象并将其映射到属性。 - Anthony Pegram
你的评论给了我一个想法 - 我创建了一个新类,包含这两个对象的引用。然后就可以轻松地绑定到这些对象的特定属性了 :) - Jamie
让我感到悲哀的是,linq仍然没有解决这个问题。 - NetMage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接