Use Join queries with dynamic content types
Overview
When you work with dynamic content type, such as instances of the type Telerik.Sitefinity.DynamicModules.Model.DynamicContent
, you may use various LINQ operations. This article demonstrates how to use the Join operation.
For more information, see the MSDN » Querable.Join method.
This article uses the terms TInner
, TOuter
, and TResult
with the same meaning as the MSDN article.
Supported cases
Sitefinity CMS supports the following combinations of Join
queries with generic types for outer and inner Join
arguments:
- Only
TOuter
is DynamicContent
.
- Only
TInner
is DynamicContent
.
- Both
TOuter
and TInner
are DynamicContent
.
Requirements
Sitefinity CMS support all of these combinations with some requirements on TResult
:
- You must not use dynamic types directly anywhere.
- You must return static, non-anonymous, custom result type for
TResult
.
You extract the required fields values into properties of the resulting custom static type. Using this technique, you avoid using the dynamic types directly.
The examples in this article contain the following:
- The first example defines the
JoinResult
class that the other two code samples use.
- The second example demonstrates how you must use
Join
queries.
- The third example demonstrated how you must not use
Join
queries.
Example: Define the JoinResult class
The following code samples has a DynamicContent
type Hotel
. It containing the child type Room
. To keep the results from the computation, the type JoinResults
is introduced:
Example: Recommended usage
In the following code sample, you can find examples of how you must use the Join
queries in Sitefinity CMS. The code sample demonstrates the following:
- How to use static types as return results for LINQ queries.
Instead of using dynamic types directly anywhere, return static, non-anonymous custom type for TResult
, and extract the required fields values into properties of TResult
.
- How to work with
Lstring
values on DynamicContent
types.
- How to get values for specific culture when your site uses multilingual mode.
Example: Limitations
The following code sample demonstrates edge cases and limitations that, when used, will throw exceptions:
TOuter is DynamicContent type
In this case:
- You cannot return dynamic type results as properties of objects. However, you can return dynamic type results directly (
TResult
is DynamicContent
). In this case, you must use extension methods in Telerik.Sitefinity.Data.Linq.Dynamic
to query them afterwards.
- Complex type results are supported in this case, if dynamic type results are not used. However, you can extract properties of dynamic types and assign them to other properties on a new static type.
- It is not possible to return anonymous object types.
- It is not possible to return
DynamicContent
types on properties.
TInner or both TOuter and TInner are DynamicContent types
In these cases:
- You can return anonymous types, but you cannot return dynamic types directly.
If you want to return dynamic objects in the result, you must wrap them as properties of anonymous return type.
Extension methods in Telerik.Sitefinity.Data.Linq.Dynamic
do not work after the join.
You have to use standard LINQ extension methods in subsequent expressions. These extensions will work, if used in expressions that were passed as parameters to the Join.
- It is not possible to return dynamic type directly.
Instead, wrap the dynamic types in anonymous objects or custom result objects.