【发布时间】:2016-02-13 07:19:24
【问题描述】:
我正在开发一个 ASP.NET MVC 网站,并且正在寻找一种方法来改进这个例程。它可以在 LINQ 级别或 SQL Server 级别进行改进。我希望我们最多可以在一个查询调用中完成。
我们没有限制每个Key 必须有每个LanguageId 值,实际上业务逻辑不允许这样的限制。但是,在应用程序级别,我们想警告管理员密钥缺少一个/某些语言值。所以我有这个类和查询:
public class LocalizationKeyWithMissingCodes
{
public string Key { get; set; }
public IEnumerable<string> MissingCodes { get; set; }
}
此方法获取密钥列表,以及任何缺失的代码(例如,如果我们有 en + jp + ch 语言代码,并且密钥只有 en + ch 的值,则列表将包含 jp):
public IEnumerable<LocalizationKeyWithMissingCodes> GetAllKeysWithMissingCodes()
{
var languageList = Utils.ResolveDependency<ILanguageRepository>().GetActive();
var languageIdList = languageList.Select(q => q.Id);
var languageIdDictionary = languageList.ToDictionary(q => q.Id);
var keyList = this.GetActive()
.Select(q => q.Key)
.Distinct();
var result = new List<LocalizationKeyWithMissingCodes>();
foreach (var key in keyList)
{
// Get missing codes
var existingCodes = this.Get(q => q.Active && q.Key == key)
.Select(q => q.LanguageId);
// ToList to make sure it is processed at application
var missingLangId = languageList.Where(q => !existingCodes.Contains(q.Id))
.ToList();
result.Add(new LocalizationKeyWithMissingCodes()
{
Key = key,
MissingCodes = missingLangId
.Select(q => languageIdDictionary[q.Id].Code),
});
}
result = result.OrderByDescending(q => q.MissingCodes.Count() > 0)
.ThenBy(q => q.Key)
.ToList();
return result;
}
我认为我当前的解决方案不好,因为它对每个键进行查询调用。有没有办法改进它,或者让它更快,或者在一个查询调用中打包?
编辑:这是答案的最终查询:
public IQueryable<LocalizationKeyWithMissingCodes> GetAllKeysWithMissingCodes()
{
var languageList = Utils.ResolveDependency<ILanguageRepository>().GetActive();
var localizationList = this.GetActive();
return localizationList
.GroupBy(q => q.Key, (key, items) => new LocalizationKeyWithMissingCodes()
{
Key = key,
MissingCodes = languageList
.GroupJoin(
items,
lang => lang.Id,
loc => loc.LanguageId,
(lang, loc) => loc.Any() ? null : lang)
.Where(q => q != null)
.Select(q => q.Code)
}).OrderByDescending(q => q.MissingCodes.Count() > 0) // Show the missing keys on the top
.ThenBy(q => q.Key);
}
【问题讨论】:
标签: c# sql sql-server linq