0
我使用Linq2Sql来访问为此实现的数据库和存储库模式。如何创建用于其他表达式的表达式?
public abstract class RepositoryBase<T, TDb> : IRepository<T>
{
public IQueryable<T> GetAll()
{
return GetTable().Select(GetConverter());
}
}
public class ProductRepository
: RepositoryBase<IProduct, DbData.Product>
{
protected override Table<DbData.Product> GetTable()
{
return Context.CustomerProducts;
}
protected override Expression<Func<DbData.Product, IProduct>> GetConverter()
{
return dbEntity =>
(ProdType.ProdTypeEnum)dbEntity.ProdId==ProdType.ProdTypeEnum.MyType
? (new Product1{...}) as IProduct
: (new Product2{...}) as IProduct
}
}
我需要修改以这种方式提到的代码:
protected override Expression<Func<DbData.Product, IProduct>> GetConverter()
{
return dbEntity =>
(ProdType.ProdTypeEnum)dbEntity.ProdId==ProdType.ProdTypeEnum.MyType
|| (ProdType.ProdTypeEnum)dbEntity.ProdId==ProdType.ProdTypeEnum.My2ndType
|| (ProdType.ProdTypeEnum)dbEntity.ProdId==ProdType.ProdTypeEnum.My3rdType
? (new Product1{...}) as IProduct
: (new Product2{...}) as IProduct
}
正如我将在其他地方相同的检查我想单独的函数:
public static bool IsProductOfType1(ProdType.ProdTypeEnum eProdTypeId)
{
return eProdTypeIdd==ProdType.ProdTypeEnum.MyType
|| eProdTypeId==ProdType.ProdTypeEnum.My2ndType
|| eProdTypeId==ProdType.ProdTypeEnum.My3rdType
}
protected override Expression<Func<DbData.Product, IProduct>> GetConverter()
{
return dbEntity =>
IsProductOfType1((ProdType.ProdTypeEnum)dbEntity.ProdId)
? (new Product1{...}) as IProduct
: (new Product2{...}) as IProduct
}
以下案例抛出异常:
方法'布尔IsProductOfType1(Int32)'没有支持转换为SQL
看起来像'GetConverter'方法里面我需要使用不是一个方法,而是一个表达式。但我不知道这是什么语法。
请指教。非常感谢!
我怎么可以在'GetConverter()'方法中使用此方法?我不能用它作为通常的方法(因为它在使用之前需要编译)。但是,一旦我编译它,我会得到相同的错误(猜测)。 – Budda 2011-03-11 17:23:51
对表达式不太熟悉,但是,不能将'IsProductOfType1'更改为返回表达式,以便您可以像使用它'IsProductOfType1()((ProdType.ProdTypeEnum)dbEntity.ProdId)'那样使用它。 – decyclone 2011-03-11 17:27:12
您无法将参数传递给表达式。如果你是这样的话,你会是正确的:IsProductOfType1()。Compile()((ProdType.ProdTypeEnum)dbEntity.ProdId)。但正如我所说,这几乎等于只是调用方法 – Budda 2011-03-11 17:31:09