包含复杂的nhibernate queryOver表达式

时间:2016-12-29 16:02:50

标签: c# nhibernate

我有一个域对象,我试图使用QueryOver来搜索子,子集合的属性,我不知道如何使用QueryOver来处理它。

POCO

public class ProdutoEstoqueDTO : IEntidade
{
    private int ProdutoId { get; set; }
    public ProdutoDTO ProdutoDTO { get; set; }
    public decimal Estoque { get; set; }
    public DateTime? AlteradoEm { get; set; }
}

public class ProdutoDTO : IEntidade, ISincronizavelAdm
{
    private readonly IList<ProdutoRegraTributacao> _regrasInterstaduais = new List<ProdutoRegraTributacao>();
    private IEnumerable<ProdutoAlias> _produtosAlias = new List<ProdutoAlias>();
    public int Id { get; set; }
    public ProdutoLocalizacao Localizacao { get; set; }
    public ProdutoUnidadeDTO ProdutoUnidadeDTO { get; set; }
    public ProdutoGrupoDTO ProdutoGrupoDTO { get; set; }
    public string Nome { get; set; }
    public decimal PrecoCompra { get; set; }
    public decimal MargemLucro { get; set; }
    public decimal PrecoVenda { get; set; }
    public bool Ativo { get; set; }
    public string Ncm { get; set; }
    public OrigemMercadoria OrigemMercadoria { get; set; }
    public TributacaoIcms SituacaoTributariaIcms { get; set; }
    public decimal AliquotaIcms { get; set; }
    public decimal ReducaoIcms { get; set; }
    public decimal PercentualMva { get; set; }
    public PisCst SituacaoTributariaPis { get; set; }
    public decimal AliquotaPis { get; set; }
    public CofinsCst SituacaoTributariaCofins { get; set; }
    public decimal AliquotaCofins { get; set; }
    public IpiCst SituacaoTributariaIpi { get; set; }
    public decimal AliquotaIpi { get; set; }
    public DateTime? CadastradoEm { get; set; }
    public DateTime? AlteradoEm { get; set; }
    public string ReferenciaInterna { get; set; }
    public string Observacao { get; set; }
    public IEnumerable<ProdutoRegraTributacao> RegrasInterstaduais => _regrasInterstaduais;
    public string Referencia => Id.ToString();
    public EntidadeSincronizavel EntidadeSincronizavel { get; set; } = EntidadeSincronizavel.Produto;
    public int CodigoBalanca { get; set; }

    public IEnumerable<ProdutoAlias> ProdutosAlias => _produtosAlias;

    public ProdutoDTO()
    {
        SituacaoTributariaCofins = CofinsCst.CST49;
        SituacaoTributariaPis = PisCst.CST49;
        SituacaoTributariaIpi = IpiCst.CST99;
    }
}

public class ProdutoAlias
{
    public ProdutoAlias()
    {
    }

    public ProdutoAlias(string alias, bool isCodigoBarra = true)
    {
        Alias = alias;
        IsCodigoBarras = isCodigoBarra;
        Valida();
    }

    public int Id { get; set; }
    public ProdutoDTO Produto { get; set; }
    public bool IsCodigoBarras { get; set; }
    public string Alias { get; set; }

    public void Valida()
    {
        if (!IsCodigoBarras) return;
        switch (Alias.Length)
        {
            case 8:
                ValidaCodigoBarrasEan8();
                break;
            case 13:
                ValidaCodigoBarrasEan13();
                break;
            default:
                throw new ArgumentException("Código de barras somente pode ser de 8 ou 13 digitos");
        }
    }

    private void ValidaCodigoBarrasEan8()
    {
        var temLetras = new Regex(@"[^\d]").IsMatch(Alias);

        if(temLetras) throw new ArgumentException("Código de barras deve ter apenas números");

        var codigoBarra = Alias.Select(c => int.Parse(c.ToString())).ToArray();
        var somaPares = codigoBarra[1] + codigoBarra[3] + codigoBarra[5];
        var somaImpares = codigoBarra[0] + codigoBarra[2] + codigoBarra[4] + codigoBarra[6];
        var soma = (somaPares + somaImpares*3);

        var resultado = (10 - (soma%10) == 10 ? 0 : 10 - (soma%10)) == codigoBarra[7];

        if (!resultado) throw new ArgumentException("Código de barras inválido!");
    }

    private void ValidaCodigoBarrasEan13()
    {
        var somenteNumeros = new Regex(@"[^\d]").IsMatch(Alias);

        if (somenteNumeros) throw new ArgumentException("Código de barras deve ter apenas números");

        var codigoBarra = Alias.Select(c => int.Parse(c.ToString())).ToArray();
        var somaPares = codigoBarra[1] + codigoBarra[3] + codigoBarra[5] + codigoBarra[7] + codigoBarra[9] + codigoBarra[11];
        var somaImpares = codigoBarra[0] + codigoBarra[2] + codigoBarra[4] + codigoBarra[6] + codigoBarra[8] + codigoBarra[10];
        var soma = (somaImpares + somaPares * 3);

        var resultado = (10 - (soma % 10) == 10 ? 0 : 10 - (soma % 10)) == codigoBarra[12];

        if (!resultado) throw new ArgumentException("Código de barras inválido!");
    }
}

我的queryOver

public IList<ProdutoEstoqueDTO> BuscaRapidaComEstoque(string input)
    {
        ProdutoEstoqueDTO produtoEstoqueAlias = null;
        ProdutoDTO produtoDTOAlias = null;
        IEnumerable<ProdutoAlias> listProdutoAliases = null;

        if (string.IsNullOrWhiteSpace(input))
            return Sessao.QueryOver<ProdutoEstoqueDTO>().List();

        var whereEstoqueDTO = Restrictions.Disjunction();
        var whereProdutoAlias = Restrictions.Disjunction();

        whereEstoqueDTO.Add(
            Restrictions.Like(
                Projections.Property(() => produtoDTOAlias.Nome),
                input, MatchMode.Anywhere));

        whereEstoqueDTO.Add(
            Restrictions.Like(
                Projections.Property(() => produtoDTOAlias.ReferenciaInterna),
                input, MatchMode.Anywhere));

        whereEstoqueDTO.Add(
            Restrictions.Eq(
                Projections.Cast(NHibernateUtil.String, Projections.Property(() => produtoDTOAlias.Id)),
                input));

        whereProdutoAlias.Add(
            Restrictions.Eq(
                Projections.Property<ProdutoAlias>(x => x.Alias),
                input));


        var queryOver = Sessao.QueryOver(() => produtoEstoqueAlias)
            .JoinAlias(() => produtoEstoqueAlias.ProdutoDTO, () => produtoDTOAlias, JoinType.InnerJoin)
            .Where(whereEstoqueDTO)
            .JoinAlias(() => produtoDTOAlias.ProdutosAlias, () => listProdutoAliases)
            .Where(whereProdutoAlias);


        return queryOver.List();
    }

使用NHibernate的QueryOver,我可以加入到我的ProdutoAlias系列,但是如何通过Alias进入ProdutoAlias系列找到一个?

0 个答案:

没有答案