Как я могу создать выражение для использования в другом выражении? - PullRequest
0 голосов
/ 11 марта 2011

Я использую 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 мне нужно использовать не метод, а выражение. Но я не знаю, что это за синтаксис.

Пожалуйста, сообщите. Большое спасибо!

1 Ответ

0 голосов
/ 11 марта 2011

Проблема заключается в следующем:

public static bool IsProductOfType1(ProdType.ProdTypeEnum eProdTypeId)

Этот метод должен возвращать Expression<T> вместо bool.Любой вызов внешних методов не будет конвертирован LINQ to SQL

...