Usuário com melhor resposta
Erro no meu select com linq

Pergunta
-
Tenho um select que funciona perfeitamente no T-SQL
Mudei ele pra linq pra ser usado no linq do C# com as suas adaptações
Porem esta dando o erro abaixo no meu ultimo select
Error 13 Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SchoolSystem\SchoolSystem\Mailing.aspx.cs 219 38 SchoolSystem
sourceClientes = from C in mdc.CLIENTES
join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO }
equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) }
where
CT.EMAIL != "" &&
(from H in mdc.HISTCATREVs
where
H.CODIGOTIPO == C.CODIGO &&
H.TIPO == "R" &&
H.REVISTA == "002"
select new
{
Column1 = 1
}).Single() != null &&
(from H in mdc.HISTCATREVs
where
H.CODIGOTIPO == C.CODIGO &&
H.TIPO == "C" &&
H.CATEGORIA == "CON"
select new
{
Column1 = 1
}).Single() != null
orderby CT.EMAIL
select new
{
CODIGO = (int?)C.CODIGO,
C.RAZAO,
CT.EMAIL
};
Respostas
-
Entendi,
bom e as outras propriedades além de código e razão não será preenchida ? Se for seria assim:
sourceClientes = (from C in mdc.CLIENTES join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO } equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) } where CT.EMAIL != "" && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "R" && H.REVISTA == "002" select new { Column1 = 1 }).Single() != null && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "C" && H.CATEGORIA == "CON" select new { Column1 = 1 }).Single() != null orderby CT.EMAIL select new { CODIGO = (int)C.CODIGO, C.RAZAO, CT.EMAIL }).ToList() .Select(i => new Clientes { CODIGO = (int)i.CODIGO, RAZAO = i.RAZAO }).ToList();
- Marcado como Resposta Marcos SJ quinta-feira, 6 de agosto de 2015 20:00
Todas as Respostas
-
Não é só converter...
tem que entender o que ele retorna e ir fazendo a query aos poucos, algumas condições tem uns jeitos bizarros de fazer mas na web tem, e se souber o que procura vai achar e conseguir colocar no código.
mas tem que ir fazendo aos poucos e verificando se é certo no linq. realmente não é só "converter"
Desenvolvedor de sistemas VB6, ASP, ASP.NET, C#, VB.NET, SQL Server, Oracle e MySql.
-
Bom dia Eric
Eu analisei o código inteiro antes de postar.
Fiz como você colocou pedaço por pedaço
E a parte que esta com erro e nesse select
select new
{
CODIGO = (int?)C.CODIGO,
C.RAZAO,
CT.EMAIL
};Não entendi o motivo.
Você pode me ajudar por favor.
Obrigado.
-
Olá,
esse erro é que sua variavel "sourceClientes" espera um tipo Clientes não um tipo anonimo, ficaria algo desse tipo :
select new CLIENTES { CODIGO = (int?)C.CODIGO, C.RAZAO, CT.EMAIL }).ToList();
faça a alteração para retornar o tipo Clientes que vai funcionar.
-
Remove ? e teste novamente, quando digita C. o campo código aparece no intelisense?
A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel
- Sugerido como Resposta Marcos SJ terça-feira, 4 de agosto de 2015 20:07
-
Muito Obrigado pela ajuda pessoal
Mas continua ainda com um erro no código.
Desculpa por não conseguir resolver mas estou começando a estudar o código ASP.NET C#.
Error 1 Invalid expression term ')' C:\ARTSIM\SchoolSystem\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem
Error 2 ; expected C:\ARTSIM\SchoolSystem\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem
select new CLIENTES
{
CODIGO = (int?)C.CODIGO,
C.RAZAO,
CT.EMAIL
}).ToList();Agora o erro só ficou no ).ToList();
Se alguem puder me ajudar eu agradeço muito.
Obrigado.
-
Olá,
supondo que o resto da query esteja correta veja :
sourceClientes = (from C in mdc.CLIENTES join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO } equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) } where CT.EMAIL != "" && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "R" && H.REVISTA == "002" select new { Column1 = 1 }).Single() != null && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "C" && H.CATEGORIA == "CON" select new { Column1 = 1 }).Single() != null orderby CT.EMAIL select new Clientes { CODIGO = (int)C.CODIGO, C.RAZAO, CT.EMAIL }).ToList();
- Editado Daniel Brito br quarta-feira, 5 de agosto de 2015 10:34
-
Boa Tarde Daniel Brito
Nossa eu ja estou até sonhando em resolver essa query. A esperança é a ultima que morre.
Vamos la.
Coloquei do jeito que você postou porem continua com erro
{
CODIGO = (int)C.CODIGO,
C.RAZAO,
CT.EMAIL
}).ToList();
Error 4 'SchoolSystem.Clientes' does not contain a definition for 'CODIGO' C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 221 43 SchoolSystem
Error 5 Invalid initializer member declarator C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 222 43 SchoolSystem
Error 6 Invalid initializer member declarator C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 223 43 SchoolSystem
-
selectnew
{
CODIGO = (int)C.CODIGO,
RAZAO = C.RAZAO,
EMAIL = CT.EMAIL
}).ToList();
Eu tentei dessa forma e mudou o erro. Acho que esta quase la.
Error 4 Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem
- Editado ricardoti2012 quarta-feira, 5 de agosto de 2015 17:17
-
select new
{
CODIGO = (int)C.CODIGO,
RAZAO = C.RAZAO,
EMAIL = CT.EMAIL
}).ToList();
Eu tentei dessa forma e mudou o erro. Acho que esta quase la.
Error 4 Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem
-
select new
{
CODIGO = (int)C.CODIGO,
RAZAO = C.RAZAO,
EMAIL = CT.EMAIL
}).ToList();
Eu tentei dessa forma e mudou o erro. Acho que esta quase la.
Error 4 Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem
Olá,
o exemplo que lhe passei funciona, mas tudo depende do tipo de retorno que você deseja, pelo que vejo sua variavel "sourceClientes" espera um objeto do tipo CLIENTES, quando faz apenas "Select New " você tenta atribuir um tipo anonimo a um tipo cliente que resulta em erro tempo de compilação, creio que deve verificar 1 o que deseja retornar para fazer funcionar.
-
Bom dia Daniel
Eu tentei dessa forma. colocando o cliente conforme o código a baixo e esta dando erro.
Quando tiver um tempinho e puder me ajudar eu agraço.
Obrigado
if(DropDownListCategorias.Text != "")
{
sourceClientes = (fromC inmdc.CLIENTES
joinCT inmdc.CONTATOS onnew{ CLIENTE = C.CODIGO }
equalsnew{ CLIENTE = Convert.ToInt32(CT.CLIENTE) }
where
CT.EMAIL != ""&&
(fromH inmdc.HISTCATREVs
where
H.CODIGOTIPO == C.CODIGO &&
H.TIPO == "R"&&
H.REVISTA == "002"
selectnew
{
Column1 = 1
}).Single() != null&&
(fromH inmdc.HISTCATREVs
where
H.CODIGOTIPO == C.CODIGO &&
H.TIPO == "C"&&
H.CATEGORIA == "CON"
selectnew
{
Column1 = 1
}).Single() != null
orderbyCT.EMAIL
selectnewCLIENTES
{
CODIGO = (int)C.CODIGO,
RAZAO = C.RAZAO,
EMAIL = CT.EMAIL
});
}
gwDados.DataSource = sourceClientes;
gwDados.DataBind();
}
catch(Exception)
{
throw;
}
finally
{
mdc.Dispose();
}
Erro:
Erro de Servidor no Aplicativo '/'.
A construção explícita do tipo de entidade 'Model.CLIENTES' na consulta não é permitida.
Descrição: Ocorreu uma exceção sem tratamento durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.
Detalhes da Exceção: System.NotSupportedException: A construção explícita do tipo de entidade 'Model.CLIENTES' na consulta não é permitida.
Erro de Origem:Linha 233: catch (Exception) Linha 234: { Linha 235: throw; Linha 236: } Linha 237: finally
Arquivo de Origem: c:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs Linha: 235
Rastreamento de Pilha:[NotSupportedException: A construção explícita do tipo de entidade 'Model.CLIENTES' na consulta não é permitida.] System.Data.Linq.SqlClient.QueryConverter.VisitMemberInit(MemberInitExpression init) +869768 System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +282 System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector) +162 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +1982 System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +69 System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1081 System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) +100 System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) +114 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +132 System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +33 System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +375 System.Linq.Enumerable.ToList(IEnumerable`1 source) +58 System.Data.Linq.Provider.BindingList.Create(DataContext context, IEnumerable`1 sequence) +85 System.Data.Linq.DataQuery`1.GetNewBindingList() +43 System.Data.Linq.DataQuery`1.System.ComponentModel.IListSource.GetList() +19 System.Web.UI.DataSourceHelper.GetResolvedDataSource(Object dataSource, String dataMember) +9674840 System.Web.UI.WebControls.ReadOnlyDataSource.System.Web.UI.IDataSource.GetView(String viewName) +42 System.Web.UI.WebControls.DataBoundControl.ConnectToDataSourceView() +130 System.Web.UI.WebControls.DataBoundControl.GetData() +9 System.Web.UI.WebControls.DataBoundControl.PerformSelect() +59 System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74 System.Web.UI.WebControls.GridView.DataBind() +9 SchoolSystem.Mailing.populateGrid(Int32 pIndex) in c:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs:235 SchoolSystem.Mailing.btnSearch_Click(Object sender, EventArgs e) in c:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs:253 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9671538 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +108 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1639
Informações sobre a Versão: Microsoft .NET Framework Versão:4.0.30319; Versão do ASP.NET:4.6.79.0 -
Entendi,
faça na memória os dados para o tipo cliente :
sourceClientes = (from C in mdc.CLIENTES join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO } equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) } where CT.EMAIL != "" && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "R" && H.REVISTA == "002" select new { Column1 = 1 }).Single() != null && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "C" && H.CATEGORIA == "CON" select new { Column1 = 1 }).Single() != null orderby CT.EMAIL select new { CODIGO = (int)C.CODIGO, C.RAZAO, CT.EMAIL }).ToList() .Select(i => new Clientes { CODIGO = (int)C.CODIGO, C.RAZAO, CT.EMAIL }).ToList();
Teste assim.
-
Daniel
Coloquei igual como você postou.
Agora esta dando esses erros:
Error 13 'SchoolSystem.Clientes' does not contain a definition for 'CODIGO' C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 227 44 SchoolSystem
Error 14 The name 'C' does not exist in the current context C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 227 58 SchoolSystem
Error 15 Invalid initializer member declarator C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 228 44 SchoolSystemOs erros estão nessas 3 linhas
CODIGO = (int)C.CODIGO,
C.RAZAO,
CT.EMAIL
- Editado ricardoti2012 quinta-feira, 6 de agosto de 2015 13:22
-
-
-
Entendi,
bom e as outras propriedades além de código e razão não será preenchida ? Se for seria assim:
sourceClientes = (from C in mdc.CLIENTES join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO } equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) } where CT.EMAIL != "" && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "R" && H.REVISTA == "002" select new { Column1 = 1 }).Single() != null && (from H in mdc.HISTCATREVs where H.CODIGOTIPO == C.CODIGO && H.TIPO == "C" && H.CATEGORIA == "CON" select new { Column1 = 1 }).Single() != null orderby CT.EMAIL select new { CODIGO = (int)C.CODIGO, C.RAZAO, CT.EMAIL }).ToList() .Select(i => new Clientes { CODIGO = (int)i.CODIGO, RAZAO = i.RAZAO }).ToList();
- Marcado como Resposta Marcos SJ quinta-feira, 6 de agosto de 2015 20:00
-
Boa tarde,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.