1

Angesichts der folgenden SQLite Tabelleerstellt nicht ordnungsgemäß ein

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') 

Und die Linq-Abfrage

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; 
} 

ich den Fehler

System.Data.Entity.Core.EntityCommandCompilationException erhalten Join Bewerben : Beim Vorbereiten der Befehlsdefinition ist ein Fehler aufgetreten. Weitere Informationen finden Sie in der inneren Ausnahme. ---> System.NotSupportedException: APPLY-Joins werden nicht unterstützt

So etwas sollte kein APPLY JOIN sein. Gibt es eine andere Möglichkeit, diese Abfrage mithilfe von LINQ durchzuführen?

Antwort

1

ich auf SqlLite nicht testen können, aber die Abfrage hat (wenn auch anders) Problem mit MySQL (es läuft mit SqlServer fein), so können Sie versuchen,

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

mit

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

, die MySQL-Problem behebt und die OUTER APPLY aus SqlServer-Abfrage beseitigt, so könnte es auch für SqlLite funktionieren.

Verwandte Themen