using System ;
using System.Linq ;
using System.Linq.Expressions ;
using Marr.Data ;
using Marr.Data.Mapping ;
namespace NzbDrone.Core.Datastore
{
public static class RelationshipExtensions
{
public static RelationshipBuilder < TParent > HasOne < TParent , TChild > ( this RelationshipBuilder < TParent > relationshipBuilder , Expression < Func < TParent , LazyLoaded < TChild > > > portalExpression , Func < TParent , int > childIdSelector )
where TParent : ModelBase
where TChild : ModelBase
{
return relationshipBuilder . For ( portalExpression . GetMemberName ( ) )
. LazyLoad (
query : ( db , parent ) = > db . Query < TChild > ( ) . SingleOrDefault ( c = > c . Id = = childIdSelector ( parent ) ) ,
condition : parent = > childIdSelector ( parent ) > 0
) ;
}
public static RelationshipBuilder < TParent > Relationship < TParent > ( this ColumnMapBuilder < TParent > mapBuilder )
{
return mapBuilder . Relationships . AutoMapComplexTypeProperties < ILazyLoaded > ( ) ;
}
public static RelationshipBuilder < TParent > HasMany < TParent , TChild > ( this RelationshipBuilder < TParent > relationshipBuilder , Expression < Func < TParent , LazyList < TChild > > > portalExpression , Func < TParent , int > childIdSelector )
where TParent : ModelBase
where TChild : ModelBase
{
return relationshipBuilder . For ( portalExpression . GetMemberName ( ) )
. LazyLoad ( ( db , parent ) = > db . Query < TChild > ( ) . Where ( c = > c . Id = = childIdSelector ( parent ) ) . ToList ( ) ) ;
}
private static string GetMemberName < T , TMember > ( this Expression < Func < T , TMember > > member )
{
var expression = member . Body as MemberExpression ;
if ( expression = = null )
{
expression = ( MemberExpression ) ( ( UnaryExpression ) member . Body ) . Operand ;
}
return expression . Member . Name ;
}
}
}