StaTypPocoQueries无法使用PetaPoco流畅的配置

问题描述 投票:1回答:1

我正在测试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与流畅配置不兼容?

提前致谢。

c# fluent petapoco
1个回答
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.PetaPoco的作者Aaron Sherber帮助了PetaPoco,并且对GH非常活跃。我打开一个问题与他讨论,因为他应该为数据库和IDatabase提供扩展

© www.soinside.com 2019 - 2024. All rights reserved.