EntityFramework a DefiningExpression rubrika: Programování: .Net

4 pilif
položil/-a 24.3.2018

Zdravím ve spolek,
mám aplikaci postavenou na EF 6.2 a nad Oraclem. Pokouším se teď najít způsob jak si definovat vlastní expression.
Jde o aplikaci nad "legacy" databází s jejíž strukturou nemůžeme manipulovat.

V jednom dotazu potřebuji spojit dvě tabulky pomocí polí, které jsou odlišných datových typů (C#: string == long, Oracle: varchar2(50) == numeric(11)).

[Table("VAZBY")]
class Vazba {
  public string Klic;
}
 
[Table("OSOBY")]
class Osoba{
  public Long Id;
}

Pokud provedu dotaz linqem:

var data = from v in Context.VazbyTable
  join o in Context.OsobyTable on v.Klic equals o.Id.ToString()

tak dostanu chybu:

ORA-00932: nekonzistentní datové typy: očekáváno -, nalezeno NCLOB

  1. 00000 - "inconsistent datatypes: expected %s got %s"

    Vygenerovaný SQLpak vypadá takto:
    SELECT 
    "Extent1"."KLIC" AS "KLIC"
    FROM  "VAZBY" "Extent1"
    INNER JOIN "OSOBY" "Extent2" ON "Extent1"."KLIC" = (TO_NCLOB("Extent2"."ID"))

Uvažoval jsem použití něčeho takového https://stackoverflow.com/questions/25261731/custom-functions-with-entit...,
ale nějak netuším kam s tím. Naše aplikace není DbFirst ani vlastně CodeFirst. EDMX a CSDL soubory zde nemáme (teda EDMX si vlastně generuji pomocí DbConfig).

Dík za nějaké nakopnutí.

Komentáře

  • harrison314 : Sklusal si SQL query namapovanu na entitu? http://www.entityframeworktutorial.net/EntityFramework4.3/raw-sql-query-... 24.3.2018
  • pilif : Ano, ale to se mi právě moc nelíbilo. Za prvo proto abych se vyhnul RAW SQL a za druhé kvůli mappingu, který dělám přes AutoMapper a v případě toho RAW mi přijde poněkud nevhodný. 24.3.2018
  • harrison314 : Vies pouzit DTO dto = ctx.Database.SqlQuery< DTO >("...") a namapuje ti to na entitu 24.3.2018
  • pilif : Toto používám v jiných projektech. V tomto projektu je ovšem situace taková, že máme odlišnou jmennou konvenci než entity v databázi a současně se tam provádí různé konverze. Takže autommapper nám řeší mapování POL_VZ na PolVz apodobně. Pak ještě konverze s CHAR na boolean nebo na VARCHAR2 na enum. Tak nějak jsem to chtěl mít dělané vždy stejným způsobem právě z tohoto důvodu :( 25.3.2018
  • harrison314 : Asi sme sa trochu nepochopili,v mojom priklade je DTO entita, u teba tto bude "Vazba" a tu potom automaperom premapujes na to co potrebujes. 25.3.2018

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.