我正在使用Repository Pattern并且正在尝试构建一个泛型方法,因为我有一些对象以相同的方式从它们的存储库中提取:
我的存储库是以这种方式创建的:
public interface IEntityRepository<T> : IDisposable
public interface IAuditorRepository : IEntityRepository<Auditor>
public class AuditorRepository : IAuditorRepository
Auditor类定义为:
public class BaseEntity : IObjectWithState
public partial class Auditor : BaseEntity
除了AuditorRepository,我还有其他一些如BuildingRepository。现在我正在尝试创建一个通用方法,我可以在其中传递存储库:
public List<EditSelectItemViewModel> GetItems<T>(IEntityRepository<T> repos) where T : BaseEntity
{
var d = repos.All.Where(x => x.isActive).OrderBy(x => x.Name).Include(z => z.Contracts)
.Select(y => new EditSelectItemViewModel
{
Id = y.Id,
SourceName = y.Name,
DisplayOnNew = y.DisplayOnNew,
NumberOfTimesUsed = y.ActiveContracts.Count(a => a.isActive)
}).ToList();
return d;
}
但是我继续在.Where上得到一个错误,声明这是一个模棱两可的参考。所有存储库都实现All方法,例如下面是AuditorRepository版本:
public IQueryable<DomainClasses.Auditor> All { get { return _context.Auditors; } }
IEntityRepostiory定义为:
public interface IEntityRepository<T> : IDisposable
{
IQueryable<T> All { get; }
//List<T> AllRequests { get; }
IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties);
T Find(params object[] keyValues);
void InsertOrUpdateGraph(T entityGraph);
void InsertOrUpdate(T entity);
void Delete(params object[] keyValues);
}
并且baseEntity为:
public class BaseEntity : IObjectWithState
{
public State State { get; set; }
}
国家定义为:
public interface IObjectWithState
{
State State { get; set; }
}
public enum State
{
Added,
Unchanged,
Modified,
Deleted
}
答案 0 :(得分:3)
正如我最初想的那样,出现了模糊调用错误,因为lambda表达式x => x.isActive
无效,因为类isActive
中缺少对变量BaseEntity
的定义(类用作方法GetItems
)中类型参数的约束。
可以使用以下代码重现错误:
(new object[0]).AsQueryable().Where(o => o == notDefined);
在我的上下文中,notDefined
未定义,同时引发了Where扩展方法的Ambiguous调用错误。一旦lambda表达式被修复(例如o != null
),就不再抛出错误。
此Ambiguous调用错误的屏幕截图以及其他匹配的方法。