我正在使用Entiry Framework 6,我的一个函数将返回Database.SqlQuery
的DbRawSqlQuery<TElement>
输出。DbRawSqlQuery<TElement>
。我希望我的类的接口不要对Entity Framework有任何依赖,所以我不想直接返回IEnumerable<T>
,但我也希望公开IListSource
和{{1接口。
我知道C#没有&#34;鸭子打字&#34;对于接口,所以我不能做
interface IQueryResult<out T> : IEnumerable<T>, IListSource
{
}
//Elsewhere
public IQueryResult<T> RunQuery<T>()
{
return this.Database.SqlQuery<T>(GetQuery());
}
我想我必须使用某种包装来解决这个问题,但还有其他选择吗?
答案 0 :(得分:1)
以下是如何使用包装类
解决此问题的示例public interface IQueryResult<out T> : IEnumerable<T>, IListSource
{
}
internal class QueryResultWrapper<T> : IQueryResult<T>
{
private readonly DbRawSqlQuery<T> _source;
public QueryResultWrapper(DbRawSqlQuery<T> source)
{
_source = source;
}
public bool ContainsListCollection
{
get { return ((IListSource)_source).ContainsListCollection; }
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)_source).GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
return _source.GetEnumerator();
}
public IList GetList()
{
return ((IListSource)_source).GetList();
}
}
然后将调用方法修改为
public IQueryResult<T> CallStoredProcedure<T>(string query)
{
return new QueryResultWrapper<T>(this.Database.SqlQuery<T>(query));
}