1

Appliquer Vu la table sqlite suivantea créé un mal Rejoindre

CREATE TABLE `ComponentNameLookup` (
    `Id` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `ComponentId` INTEGER NOT NULL, 
    `ComponentName` TEXT NOT NULL, 
    `Culture` TEXT 
); 

insert into ComponentNameLookup 
    (Id,ComponentId,ComponentName,Culture) 
values 
    (1, 0, 'Logger',     NULL ), 
    (2, 1, 'Transport',    NULL ), 
    (3, 2, 'Error Handler',   NULL ), 
    (4, 3, 'Persistance',    NULL ), 
    (5, 0, 'Registrador',   'es-ES'), 
    (6, 1, 'Transporte',    'es' ), 
    (7, 2, 'Controlador de errores', 'es-ES'), 
    (8, 3, 'Persistencia',   'es-ES'), 
    (9, 1, 'Транспорт',    'ru' ), 
    (10, 2, 'Обработчик ошибок',  'ru-RU') 

Et la requête LINQ

void Main() 
{ 
    string cultureString = Thread.CurrentThread.CurrentCulture.Name; 
    string languageName = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName; 

    cultureString = "es-ES"; 
    languageName = "es"; 

    var localized = context.ComponentNameLookups 
     .Where(x => x.Culture == cultureString || x.Culture == languageName || x.Culture == null) 
     .GroupBy(c => c.ComponentId) 
     .Select(g => new KeyValue<int?, string>{ 
      Key = g.Key, 
      Value = g 
       .OrderByDescending(x => x.Culture.Length) 
       .Select(c => c.ComponentName) 
       .FirstOrDefault(), 
     }) 
    ; 
    localized.ToArray(); 
} 

public class KeyValue<T1, T2> { 
    public T1 Key; 
    public T2 Value; 
} 

Je reçois l'erreur

System.Data.Entity.Core.EntityCommandCompilationException : Une erreur s'est produite lors de la préparation de la définition de la commande. Voir l'exception interne pour plus de détails. ---> System.NotSupportedException: les jointures APPLY ne sont pas supportées

Quelque chose comme ceci ne devrait pas avoir besoin d'être APPLY JOIN. Existe-t-il un autre moyen de faire cette requête en utilisant LINQ?

Répondre

1

Je ne peux pas tester sur SqlLite, mais la requête a (bien différent) problème avec MySQL (il fonctionne très bien avec SqlServer), de sorte que vous pouvez essayer de remplacer

.OrderByDescending(x => x.Culture.Length) 

avec

.Where(c => c.Culture.Length == g.Max(e => e.Culture.Length)) 

qui corrige le problème MySQL et élimine le OUTER APPLY de la requête SqlServer, donc cela peut aussi fonctionner pour SqlLite.