2011-03-11 73 views
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'方法裏面我需要使用不是一個方法,而是一個表達式。但我不知道這是什麼語法。

請指教。非常感謝!

回答

0

的問題就在這裏:

public static bool IsProductOfType1(ProdType.ProdTypeEnum eProdTypeId) 

這個方法應該返回一個Expression<T>,而不是bool。任何調用外部方法將不會被轉換器通過LINQ to SQL

+0

我怎麼可以在'GetConverter()'方法中使用此方法?我不能用它作爲通常的方法(因爲它在使用之前需要編譯)。但是,一旦我編譯它,我會得到相同的錯誤(猜測)。 – Budda 2011-03-11 17:23:51

+0

對錶達式不太熟悉,但是,不能將'IsProductOfType1'更改爲返回表達式,以便您可以像使用它'IsProductOfType1()((ProdType.ProdTypeEnum)dbEntity.ProdId)'那樣使用它。 – decyclone 2011-03-11 17:27:12

+0

您無法將參數傳遞給表達式。如果你是這樣的話,你會是正確的:IsProductOfType1()。Compile()((ProdType.ProdTypeEnum)dbEntity.ProdId)。但正如我所說,這幾乎等於只是調用方法 – Budda 2011-03-11 17:31:09