Select all columns after JOIN in LINQ
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);
Jamie
Updated on July 20, 2022Comments
-
Jamie almost 2 years
I have two tables,
Table1
andTable2
. 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
, whereTABLE3
is a resulting relation (after joiningTABLE1
andTABLE2
).Thanks in advance for the clues.
-
Jamie over 12 yearsdoesn'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()...
-
Anthony Pegram over 12 yearsNo, 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 invokeToString()
, but the query itself it authentic, tt simply uses the entire object and maps it to a property. -
Jamie over 12 yearsyour 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 :)
-
NetMage over 7 yearsIt saddens me that linq still doesn't have a solution for this.