c# - How to make Exists with Dynamic Linq -
how make exists dynamic linq?
i'm trying create sql clause dynamic linq. researched lot of , not found satisfactory answer.
i try convert sql query follows:
sql
select * documento exists( select 1 titulo documento.coddocumento = titulo.coddocumento , documento.codempresa = titulo.codempresadocumento , titulo.codfluxoconta = 'somevalue' , titulo.codempresafluxoconta = 'stringnumerical')
in common linq did follows:
var subquery2 = t in db.titulos t.codfluxoconta == "somevalue" && t.codempresafluxoconta == "stringnumerical" select new { coddoc = (int?)t.coddocumento, codemp = (string)t.codempresadocumento }; var query2 = d in db.documentos subquery2.contains(new { coddoc = (int?)d.coddocumento, codemp = (string)d.codempresa }) select new{ d.coddocumento, d.codempresa };
or
var query4 = db.documentos.where(d => (db.titulos.where(t => t.codfluxoconta == "somevalue" && t.codempresafluxoconta == "stringnumerical").select(t2 => new { coddoc = (int?)t2.coddocumento, codemp = (string)t2.codempresadocumento })).contains(new { coddoc = (int?)d.coddocumento, codemp = (string)d.codempresa }));
and did knowledge
iqueryable linq = db.set(t); var exists = linq.where("codfluxoconta == @0 && codempresafluxoconta == @1", "somevalue", "stringnumerical").select("new(\"coddocumento\" coddoc, \"codempresadocumento\" codemp)"); var query = db.documentos.where("@0.contains(new (it[\"coddocumento\"] coddocumento, it[\"codempresa\"] codempresadocumento))", exists);
but when execute code following exception occurs:
no applicable indexer exists in type 'dynamicclass3'.
this seems work... uses outerit
... , don't know through magic any
inside where()
works...
var sq = titulo.where("codfluxoconta == @0 && codempresafluxoconta == @1", "somevalue", "stringnumerical"); var result = documento.where("@0.any(it.coddocumento == outerit.coddocumento && it.codempresadocumento == outerit.codempresadocumento)", sq) .select("new(coddocumento, codempresadocumento)");
in where()
, it
subquery element, while outerit
documento
.
i've checked sql profiler , result of query is:
select [extent1].[coddocumento] [coddocumento], [extent1].[codempresadocumento] [codempresadocumento] [dbo].[documento] [extent1] exists (select 1 [c1] [dbo].[titulo] [extent2] (n'somevalue' = [extent2].[codfluxoconta]) , (n'stringnumerical' = [extent2].[codempresafluxoconta]) , ([extent2].[coddocumento] = [extent1].[coddocumento]) , ([extent2].[codempresadocumento] = [extent1].[codempresadocumento]) )
that equivalent query.
note in dynamic linq possible write query similar 1 wrote in linq, using .contains()
(but note prefer .any()
.contains()
). 2 queries produce same sql query entity framework.
var sq2 = db.titulo.where("codfluxoconta == @0 && codempresafluxoconta == @1", "somevalue", "stringnumerical") .select("new(coddocumento, codempresadocumento)"); var result2 = db.documento.where("@0.contains(new(outerit.coddocumento, outerit.codempresadocumento))", sq2) .select("new(coddocumento coddoc, codempresadocumento codemp)");
Comments
Post a Comment