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