StaTypPocoQueries无法使用PetaPoco流畅配置

时间:2019-04-04 23:14:56

标签: c# fluent petapoco

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

我不想创建PetaPoco的Database类的实例,因此我创建了一个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);
    }
}

但是我在lambda表达式中遇到了一个错误,提示“无法将lambda表达式转换为'string'类型,因为它不是委托类型” 。 问题是,如果我使用经典的PetaPoco配置而不是流利的话(即为每个请求创建一个新的Database对象),我就不会出现该错误。

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

谢谢。

1 个答案:

答案 0 :(得分:2)

扩展方法适用于类型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);
    }
}

正如我所预料的那样,如果是这种情况,StaTypPocoQueries的作者Aaron Sherber.PetaPoco可以为PetaPoco提供帮助,并且对GH非常积极。我要与他讨论一个问题,因为也许他应该同时提供数据库和IDatabase的扩展