Я использую 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
}
В следующем случае выдается исключение:
Метод 'Boolean IsProductOfType1 (Int32)' не поддерживает перевод на SQL
Кажется, внутри метода GetConverter мне нужно использовать не метод, а выражение. Но я не знаю, что это за синтаксис.
Пожалуйста, сообщите. Большое спасибо!