1

考虑下面的SQLite表创建不当的申请加入

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

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

我得到的错误

System.Data.Entity.Core.EntityCommandCompilationException :准备命令定义时发生错误。详情请参阅内部例外。 ---> System.NotSupportedException:不支持APPLY连接

这样的事情不应该是一个APPLY JOIN。有没有其他方法可以使用LINQ来执行此查询?

回答

1

我不能SqlLite测试,但查询有(虽然不同)与MySQL的问题(它运行与SqlServer的罚款),所以你可以尝试用

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

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

修复了MySQL问题,并从SqlServer查询中删除了OUTER APPLY,所以它也可以用于SqlLite。