StaTypPocoQueries не работает с плавной конфигурацией PetaPoco - PullRequest
1 голос
/ 05 апреля 2019

Я тестирую PetaPoco как альтернативу Fluent NHibernate, и я добавил расширение StaTypPocoQueries.PetaPoco, чтобы использовать лямбда-выражения для построения запросов, точно так же, как Fluent NHibernate.

Я не хочу создавать экземпляр класса Database для PetaPoco, поэтому я создал класс Configuration Manager, чтобы настроить его при запуске программы.

public class PetaPocoSessionManager
{
    public static string connectionString;

    public PetaPocoSessionManager()
    {
        connectionString = null;
    }

    public IDatabase CreateSession()
    {
        return DatabaseConfiguration.Build()
                    .UsingProvider<SqlServerDatabaseProvider>()
                    .UsingConnectionString(connectionString)
                    .UsingDefaultMapper<ConventionMapper>()
                    .WithAutoSelect()
                    .Create();
    }

}

А теперь в моем классе репозитория я создаю метод для запроса по какому-то конкретному полю.

[TableName("co")]
public class CustomerOrder
{
    public string OrderNumber { get; set; }
    public string CustomerNumber { get; set; }
    public decimal Price { get; set; }
    public DateTime OrderDate { get; set; }
    public string OrderType { get; set; }
    public string Status { get; set; }
    public string Warehouse { get; set; }
    public string OriginSite { get; set; }
    public string TakenBy { get; set; }
    public string ExportType { get; set; }
    public string Contact { get; set; }
    public string CurrencyCode { get; set; }
    public string TaxCode { get; set; }
}


public class CustomerOrderBL
{
    private IDatabase session;

    public CustomerOrderBL(IDatabase session)
    {
        this.session = session;
    }

    public CustomerOrder GetByCoNum(string coNum)
    {
        return session.FirstOrDefault<CustomerOrder>(x => x.CustomerNumber == coNum);
    }
}

Однако я получил ошибку в лямбда-выражении, которая говорит, что "не может преобразовать лямбда-выражение в тип 'string', потому что это не тип делегата" . Дело в том, что у меня нет этой ошибки, если я использую классическую конфигурацию PetaPoco вместо fluent (это создание нового объекта базы данных для каждого запроса).

Я что-то не так делаю? Или StaTypPocoQueries не совместим с текущими настройками?

Заранее спасибо.

1 Ответ

2 голосов
/ 05 апреля 2019

Метод расширения предназначен для типа Database, а не IDatabase.Я думаю, именно поэтому он не разрешается правильно.

Позвольте мне объяснить.

Поскольку в вашем классе CustomerOrderBL вы ссылаетесь на IDatabase, а не Database, это вызывает session.FirstOrDefault<CustomerOrder>(x => x.CustomerNumber == coNum) для разрешения T SingleOrDefault<T>(object primaryKey);, а не для метода расширения, определенного пакетом StaTypePocoQueries.PetaPoco.

Вы можете легко проверить это с помощью следующего класса

public class CustomerOrderBL
{
    private Database session;

    public CustomerOrderBL(Database session)
    {
        this.session = session;
    }

    public CustomerOrder GetByCoNum(string coNum)
    {
        return session.FirstOrDefault<CustomerOrder>(x => x.CustomerNumber == coNum);
    }
}

Если это,как я и предсказывал, это тот случай, когда автор Aaron Sherber из StaTypPocoQueries.PetaPoco очень хорошо помогает PetaPoco и очень активен в GH.Я бы открыл вопрос, чтобы обсудить его с ним, так как, возможно, ему следует предоставлять расширения как для базы данных, так и для базы данных

...