【发布时间】:2011-04-06 12:51:23
【问题描述】:
我遇到了异常 无法将类型“MySomeTypeThatImplementsISomeInterfaceAndIsPassedAs[T]ToTheClass”转换为类型“ISomeInterface”。 LINQ to Entities 仅支持转换实体数据模型基元类型。
我的存储库看起来像
public interface IRepository<T>
{
IQueryable<T> Get(System.Linq.Expressions.Expression<System.Func<T, bool>> Query);
}
另外,我有服务类
public abstract class FinanceServiceBase<TAccount, TParcel, TPayment>
where TAccount : IAccount
where TParcel : IParcel
where TPayment : IPayment
{
//...
IRepository<TPayment> ParcelRepository {get; private set;}
public bool MakePayment(TPayment payment)
{
//...
ParcelRepository.Get(p => p.ParcelId == 2);
// here my exception is thrown
// **p.ParcelId is in IParcel**
//...
}
}
//...
通过这个课程,我可以控制很多关于财务的事情,而无需为其他程序重写代码。我用 3 个通用参数完成了这个类,因为我不能使用 IRepository,因为我的存储库不能是 <out T>
ParcelId 是 Int32
TParcel 是 typeof(ParcelToReceive) 是一个实现IParcel的实体,是用codeonly生成的
当我调用 Get 时出现问题,生成的 lambda 看起来像
(**(ISomeInterface)**$p).SomeInterfaceMember ==
而不是
($p.SomeInterfaceMember)
所以,实体框架尝试进行强制转换并抛出异常。我想知道的是:无论如何告诉linq lambda 字段p.ParcelId 来自TParcel 而不是来自IParcel。
已经尝试过(没有运气):
p => ((TParcel)p).ParcelId
谢谢
【问题讨论】:
-
您的问题令人困惑且措辞不佳。请改写。
-
我认为这个问题有道理并且足够清楚。
标签: c# entity-framework lambda code-reuse