我有一个域对象,我试图使用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系列找到一个?