StaTypPocoQueries 不适用于 PetaPoco 流畅配置

StaTypPocoQueries not working with PetaPoco fluent configuration

我正在测试 PetaPoco 作为 Fluent NHibernate 的替代品,我添加了扩展 StaTypPocoQueries.PetaPoco 以使用 lambda 表达式构建查询,就像 Fluent NHibernate 一样。

我不想创建 PetaPoco 的数据库实例 class,所以我制作了一个配置管理器 class 在程序启动时对其进行配置。

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();
    }

}

现在在我的存储库中 class 我构建了一个方法来通过某些特定字段进行查询。

[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);
    }
}

但是我在 lambda 表达式中遇到了一个错误 "cannot convert lambda expression to type 'string' because it is not a delegate type"。 问题是,如果我使用 classic PetaPoco 配置而不是 fluent(即,为每个请求创建一个新的数据库对象),我就不会出现该错误。

我是不是做错了什么?或者 StaTypPocoQueries 与流畅的配置不兼容?

提前致谢。

扩展方法适用于类型 Database 而不是 IDatabase。我认为这就是它无法正确解析的原因。

请允许我解释一下。

因为在您的 CustomerOrderBL class 中,您引用的是 IDatabase 而不是 Database,这导致 session.FirstOrDefault<CustomerOrder>(x => x.CustomerNumber == coNum) 解析为 T SingleOrDefault<T>(object primaryKey);,并且不是 StaTypePocoQueries.PetaPoco 包定义的扩展方法。

您可以使用以下 class

轻松测试它
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);
    }
}

如果像我预测的那样,StaTypPocoQueries.PetaPoco 的作者 Aaron Sherber 对 PetaPoco 提供了相当多的帮助,并且在 GH 方面非常活跃。我会打开一个问题与他讨论,因为也许他应该为数据库和 IDatabase

提供扩展