10

I have two tables, Table1 and Table2. I want to perform, say, a left outer 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,
                       //...
                   };

As you can notice, I want to select all the properties of both objects from the resulting table (the enumerables considered while joining contain the objects of certain types - these are different for both relations). Of course, I can select the properties in the anonymous select, as shown in the example.

My question is how to avoid specifying all the properties manually? I would like to have something like SELECT * FROM TABLE3, where TABLE3 is a resulting relation (after joining TABLE1 and TABLE2).

Thanks in advance for the clues.

Jamie
  • 1,092
  • 3
  • 22
  • 44

1 Answers1

10

You have to specify each manually if you want to project into a flattened type. Your other option is to just have your combined type contain both objects, and the objects will naturally bring along their properties.

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

And you would work with it like myObj.Object1.Property1, myObj.Object2.Property4, etc.

One final option that still involves some manual work is to define an appropriate type and have a constructor or a builder method that does the work of segmenting out your object properties into a flattened type. You still perform the manual mapping, but you isolate it from your query logic.

select new CombinedType(object1, output);
//or 
select builder.GetCombinedType(object1, output);
Anthony Pegram
  • 123,721
  • 27
  • 225
  • 246
  • doesn't the first option use ToString() method during the assignment? In that case I will get for instance "Namespace.MyType" values in the column named Object1 after doing myOutput.ToArray()... – Jamie Oct 22 '11 at 17:05
  • No, it would not invoke `ToString()`, what gives you the idea that it would? Are you binding it to a UI control of some sort? The *control* might invoke `ToString()`, but the query itself it authentic, tt simply uses the entire object and maps it to a property. – Anthony Pegram Oct 22 '11 at 17:09
  • your comment gave me an idea - I've made a new class containing references for both objects. Then it is easy to bind to certain properties of these :) – Jamie Oct 27 '11 at 13:01
  • It saddens me that linq still doesn't have a solution for this. – NetMage Oct 20 '16 at 20:43