190 messaggi dal 09 novembre 2005
Ciao a tutti,
prima volta che mi trovo a dover fare un'intersezione al contratio, oltre a questo, però, il mio problema è che T è una classe con una particolare struttura, quindi il mio IEqualityComparer deve fare un po di test per identificare l'entità che rispetta il criterio.

Ecco il mio approccio, devo cercare le traduzioni mancanti in una particolare lingua...

IQueryable<Translation> translationsBase = from rec in ctx.Translations
           where rec.LanguageID == baseValueLangID
           select rec;
IQueryable<Translation> translationsToUpdate = from rec in ctx.Translations
               where rec.LanguageID == transValueLangID
               select rec;
IQueryable<Dictionary> dictionaryValues = from rec in ctx.Dictionaries
          select rec;
IQueryable<Translation> result = translationsBase.Except(translationsToUpdate, 
          new TranslationEqualityComparer());


Ecco il mio "comparatore"

public class TranslationEqualityComparer : IEqualityComparer<Translation>
{
  public bool Equals(Translation tBase, Translation tTranslate)
  {
    bool result = true;

    if(!tBase.K1.StartsWith("A"))
    {
      if (tBase.K1 != tTranslate.K1)
        return false;
    }

    if (!tBase.K2.StartsWith("A"))
    {
      if (tBase.K2 != tTranslate.K2)
        return false;
    }

    if (!tBase.K3.StartsWith("A"))
    {
      if (tBase.K3 != tTranslate.K3)
        return false;
    }

    if (!tBase.K4.StartsWith("A"))
    {
      if (tBase.K4 != tTranslate.K4)
        return false;
    }

    if (!tBase.K5.StartsWith("A"))
    {
      if (tBase.K5 != tTranslate.K5)
        return false;
    }

    if (!tBase.K6.StartsWith("A"))
    {
      if (tBase.K6 != tTranslate.K6)
        return false;
    }

    if (!tBase.K7.StartsWith("A"))
    {
      if (tBase.K7 != tTranslate.K7)
        return false;
    }

    return result;
  }

  public int GetHashCode(Translation tBase)
  {
    return tBase.ID;
  }
}


Alla riga dove eseguo l'Except mi dive che LINQ non riconosce il metodo "Except", cosa signifca?

Qualcuno può aiutarmi?
Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
quando esegui una query LINQ su un DbSet di EntityFramework, dietro le quinte c'è un provider che deve tradurre la tua query in una SELECT in linguaggio SQL. In questo caso non ci sta riuscendo, perché hai usato della logica complessa in C# che non può essere tradotta in SQL.

La soluzione consiste nel recuperare le entità dal database e poi, quando ormai i risultati sono ormai in memoria, sottoporli al metodo Except.
E' abbastanza facile, devi solo aggiungere un ToList() che forzerà EF a recuperare i dati dal db. Dopo il ToList() puoi usare l'Except()

IEnumerable<Translation> result = translationsBase.ToList().Except(translationsToUpdate, 
          new TranslationEqualityComparer());


Dato che ToList() restituisce un IEnumerable (e non un IQueryable), l'extension method Except usato sarà quello che opera sugli IEnumerable (e quindi su oggetti in memoria).

ciao,
Moreno
Modificato da BrightSoul il 29 novembre 2015 11.06 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.