Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Building on guido's answer, here's one which disconnects all NHibernate dependencies from the repository interface. Quite a bit of boiler plate though and probably not a good technique if you want to make use of a lot of NHibernate specific functionality; then referencing the NHibernate.dll might be more appropriate.</p> <p>First the interfaces:</p> <pre><code>public interface IFetchableQueryable&lt;TQueried&gt; : IQueryable&lt;TQueried&gt; { IFetchRequest&lt;TQueried, TRelated&gt; Fetch&lt;TRelated&gt;(Expression&lt;Func&lt;TQueried, TRelated&gt;&gt; relatedObjectSelector); IFetchRequest&lt;TQueried, TRelated&gt; FetchMany&lt;TRelated&gt;(Expression&lt;Func&lt;TQueried, IEnumerable&lt;TRelated&gt;&gt;&gt; relatedObjectSelector); } public interface IFetchRequest&lt;TQueried, TFetch&gt; : IOrderedQueryable&lt;TQueried&gt; { IFetchRequest&lt;TQueried, TRelated&gt; ThenFetch&lt;TRelated&gt;(Expression&lt;Func&lt;TFetch, TRelated&gt;&gt; relatedObjectSelector); IFetchRequest&lt;TQueried, TRelated&gt; ThenFetchMany&lt;TRelated&gt;(Expression&lt;Func&lt;TFetch, IEnumerable&lt;TRelated&gt;&gt;&gt; relatedObjectSelector); } </code></pre> <p>And then the implementation:</p> <pre><code> public class FetchableQueryable&lt;TQueried&gt; : IFetchableQueryable&lt;TQueried&gt; { public FetchableQueryable(IQueryable&lt;TQueried&gt; query) { this.Query = query; } public IQueryable&lt;TQueried&gt; Query { get; private set; } #region IEnumerable&lt;TQueried&gt; Members public IEnumerator&lt;TQueried&gt; GetEnumerator() { return this.Query.GetEnumerator(); } #endregion #region IEnumerable Members System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.Query.GetEnumerator(); } #endregion #region IQueryable Members public Type ElementType { get { return this.Query.ElementType; } } public Expression Expression { get { return this.Query.Expression; } } public IQueryProvider Provider { get { return this.Query.Provider; } } #endregion #region IFetchableQueryable&lt;TQueried&gt; Members public IFetchRequest&lt;TQueried, TRelated&gt; Fetch&lt;TRelated&gt;(Expression&lt;Func&lt;TQueried, TRelated&gt;&gt; relatedObjectSelector) { return new FetchRequest&lt;TQueried, TRelated&gt;(this.Query.Fetch&lt;TQueried, TRelated&gt;(relatedObjectSelector)); } public IFetchRequest&lt;TQueried, TRelated&gt; FetchMany&lt;TRelated&gt;(Expression&lt;Func&lt;TQueried, IEnumerable&lt;TRelated&gt;&gt;&gt; relatedObjectSelector) { return new FetchRequest&lt;TQueried, TRelated&gt;(this.Query.FetchMany&lt;TQueried, TRelated&gt;(relatedObjectSelector)); } #endregion } public class FetchRequest&lt;TQueried, TFetch&gt; : IFetchRequest&lt;TQueried, TFetch&gt; { public FetchRequest(INhFetchRequest&lt;TQueried, TFetch&gt; nhFetchRequest) { NhFetchRequest = nhFetchRequest; } public INhFetchRequest&lt;TQueried, TFetch&gt; NhFetchRequest { get; private set; } #region IEnumerable&lt;TQueried&gt; Members public IEnumerator&lt;TQueried&gt; GetEnumerator() { return NhFetchRequest.GetEnumerator(); } #endregion #region IEnumerable Members System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return NhFetchRequest.GetEnumerator(); } #endregion #region IQueryable Members public Type ElementType { get { return NhFetchRequest.ElementType; } } public System.Linq.Expressions.Expression Expression { get { return NhFetchRequest.Expression; } } public IQueryProvider Provider { get { return NhFetchRequest.Provider; } } #endregion #region IFetchRequest&lt;TQueried,TFetch&gt; Members public IFetchRequest&lt;TQueried, TRelated&gt; Fetch&lt;TRelated&gt;(Expression&lt;Func&lt;TQueried, TRelated&gt;&gt; relatedObjectSelector) { var fetch = EagerFetchingExtensionMethods.Fetch(this.NhFetchRequest, relatedObjectSelector); return new FetchRequest&lt;TQueried, TRelated&gt;(fetch); } public IFetchRequest&lt;TQueried, TRelated&gt; FetchMany&lt;TRelated&gt;(Expression&lt;Func&lt;TQueried, IEnumerable&lt;TRelated&gt;&gt;&gt; relatedObjectSelector) { var fecth = EagerFetchingExtensionMethods.FetchMany(this.NhFetchRequest, relatedObjectSelector); return new FetchRequest&lt;TQueried, TRelated&gt;(fecth); } public IFetchRequest&lt;TQueried, TRelated&gt; ThenFetch&lt;TRelated&gt;(Expression&lt;Func&lt;TFetch, TRelated&gt;&gt; relatedObjectSelector) { var fetch = EagerFetchingExtensionMethods.ThenFetch(this.NhFetchRequest, relatedObjectSelector); return new FetchRequest&lt;TQueried, TRelated&gt;(fetch); } public IFetchRequest&lt;TQueried, TRelated&gt; ThenFetchMany&lt;TRelated&gt;(Expression&lt;Func&lt;TFetch, IEnumerable&lt;TRelated&gt;&gt;&gt; relatedObjectSelector) { var fetch = EagerFetchingExtensionMethods.ThenFetchMany(this.NhFetchRequest, relatedObjectSelector); return new FetchRequest&lt;TQueried, TRelated&gt;(fetch); } #endregion } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload