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