Проблема, с которой вы сталкиваетесь при запросе, заключается в том, что вы пытаетесь получить доступ к переменным «from» после «group by», чего вы не можете сделать. Чтобы получить эти переменные, они должны либо (1) храниться вне группировки, либо (2) быть частью самой группировки.
(1)
var prodForn2 =
from produtosFornecedores in ERPDAOManager.GetTable<ProdutosFornecedores>()
join fornecedores in ERPDAOManager.GetTable<Fornecedores>()
on produtosFornecedores.ID_FORNECEDORES equals fornecedores.ID
join municipios in ERPDAOManager.GetTable<Municipios>()
on fornecedores.ID_MUNICIPIOS equals municipios.ID
join unidadesFederacao in ERPDAOManager.GetTable<UnidadesFederacao>()
on municipios.ID_UNIDADESFEDERACAO equals unidadesFederacao.ID
where produtosFornecedores.ID_PRODUTOS ==
Convert.ToInt32(objEsquemasCalculoRegras.CD_OBJETO1)
where produtosFornecedores.ID_PRODUTOSCONFIGPRECOS ==
Convert.ToInt32(objEsquemasCalculoRegras.CD_OBJETO2)
where produtosFornecedores.FG_STATUS == true
let ID_IMPOSTOSDESTINOS = (int)fornecedores.ID_IMPOSTOSDESTINOS
let ID_FORNECEDORES = (int)fornecedores.ID
let CD_UF_BASE = (string)unidadesFederacao.CD_UNIDADEFEDERACAO
group produtosFornecedores by new
{
ID_IMPOSTOSDESTINOS,
ID_FORNECEDORES,
CD_UF_BASE,
} into gpfs1
select new
{
gpfs1.Key.ID_IMPOSTOSDESTINOS,
gpfs1.Key.ID_FORNECEDORES,
gpfs1.Key.CD_UF_BASE,
PRODUTOSFORNECEDORES =
from pfs1 in gpfs1
group pfs1 by new
{
pfs1.ID_PRODUTOS,
pfs1.ID_PRODUTOSCONFIGPRECOS
} into gpfs2
select new
{
NM_PRECO_REPOSICAO = (decimal)gpfs2
.Max(item => item.NM_PRECO_REPOSICAO),
ID_MOEDAS_REPOSICAO = (int)gpfs2
.Max(item => item.ID_MOEDAS_REPOSICAO),
ID_IMPOSTOSCONFIG = (int)gpfs2
.Max(item => item.ID_IMPOSTOSCONFIG),
ID_TABELANCMS = (int)gpfs2
.Max(item => item.ID_TABELANCMS),
},
};
(2)
var prodForn2 =
from produtosFornecedores in ERPDAOManager.GetTable<ProdutosFornecedores>()
join fornecedores in ERPDAOManager.GetTable<Fornecedores>()
on produtosFornecedores.ID_FORNECEDORES equals fornecedores.ID
join municipios in ERPDAOManager.GetTable<Municipios>()
on fornecedores.ID_MUNICIPIOS equals municipios.ID
join unidadesFederacao in ERPDAOManager.GetTable<UnidadesFederacao>()
on municipios.ID_UNIDADESFEDERACAO equals unidadesFederacao.ID
where produtosFornecedores.ID_PRODUTOS ==
Convert.ToInt32(objEsquemasCalculoRegras.CD_OBJETO1)
where produtosFornecedores.ID_PRODUTOSCONFIGPRECOS ==
Convert.ToInt32(objEsquemasCalculoRegras.CD_OBJETO2)
where produtosFornecedores.FG_STATUS == true
let ID_IMPOSTOSDESTINOS = (int)fornecedores.ID_IMPOSTOSDESTINOS
let ID_FORNECEDORES = (int)fornecedores.ID
let CD_UF_BASE = (string)unidadesFederacao.CD_UNIDADEFEDERACAO
group produtosFornecedores by new
{
ID_IMPOSTOSDESTINOS,
ID_FORNECEDORES,
CD_UF_BASE,
produtosFornecedores.ID_PRODUTOS,
produtosFornecedores.ID_PRODUTOSCONFIGPRECOS,
} into gpfs
select new
{
gpfs.Key.ID_IMPOSTOSDESTINOS,
gpfs.Key.ID_FORNECEDORES,
gpfs.Key.CD_UF_BASE,
NM_PRECO_REPOSICAO = (decimal)gpfs.Max(item => item.NM_PRECO_REPOSICAO),
ID_MOEDAS_REPOSICAO = (int)gpfs.Max(item => item.ID_MOEDAS_REPOSICAO),
ID_IMPOSTOSCONFIG = (int)gpfs.Max(item => item.ID_IMPOSTOSCONFIG),
ID_TABELANCMS = (int)gpfs.Max(item => item.ID_TABELANCMS),
};
Дайте каждому из них попробовать и посмотреть, что лучше соответствует вашим потребностям.
Вы также можете обнаружить, что производительность - это проблема с группировкой и несколькими максимальными запросами, поэтому может потребоваться перенести записи в память перед группировкой результатов.
var prodForn2_1 =
from produtosFornecedores in ERPDAOManager.GetTable<ProdutosFornecedores>()
join fornecedores in ERPDAOManager.GetTable<Fornecedores>()
on produtosFornecedores.ID_FORNECEDORES equals fornecedores.ID
join municipios in ERPDAOManager.GetTable<Municipios>()
on fornecedores.ID_MUNICIPIOS equals municipios.ID
join unidadesFederacao in ERPDAOManager.GetTable<UnidadesFederacao>()
on municipios.ID_UNIDADESFEDERACAO equals unidadesFederacao.ID
where produtosFornecedores.ID_PRODUTOS ==
Convert.ToInt32(objEsquemasCalculoRegras.CD_OBJETO1)
where produtosFornecedores.ID_PRODUTOSCONFIGPRECOS ==
Convert.ToInt32(objEsquemasCalculoRegras.CD_OBJETO2)
where produtosFornecedores.FG_STATUS == true
let ID_IMPOSTOSDESTINOS = (int)fornecedores.ID_IMPOSTOSDESTINOS
let ID_FORNECEDORES = (int)fornecedores.ID
let CD_UF_BASE = (string)unidadesFederacao.CD_UNIDADEFEDERACAO
select new
{
ID_IMPOSTOSDESTINOS = (int)fornecedores.ID_IMPOSTOSDESTINOS,
ID_FORNECEDORES = (int)fornecedores.ID,
CD_UF_BASE = (string)unidadesFederacao.CD_UNIDADEFEDERACAO,
ID_PRODUTOS = produtosFornecedores.ID_PRODUTOS,
ID_PRODUTOSCONFIGPRECOS = produtosFornecedores.ID_PRODUTOSCONFIGPRECOS,
NM_PRECO_REPOSICAO = (decimal)produtosFornecedores.NM_PRECO_REPOSICAO,
ID_MOEDAS_REPOSICAO = (int)produtosFornecedores.ID_MOEDAS_REPOSICAO,
ID_IMPOSTOSCONFIG = (int)produtosFornecedores.ID_IMPOSTOSCONFIG,
ID_TABELANCMS = (int)produtosFornecedores.ID_TABELANCMS,
};
var prodForn2_2 =
from pf in prodForn2_1.ToArray()
group ...
Теперь вам просто нужно заполнить prodForn2_2
любым из вариантов (1) или (2) сверху. Обратите внимание, что вызов ToArray
заставит выполнить запрос prodForn2_1
и перенести записи в память в виде массива - тогда группировка и подзапрос происходит молниеносно. Вам просто нужно следить за использованием памяти, а не за временем выполнения запроса.
Надеюсь, это поможет.