2011-03-11 83 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