2014-03-05 89 views
0

我有一個項目列表,用於存儲在SQLite數據庫中的字符串本地化。我想檢索列表,並使用linq爲顯示目的創建項目字典。如果本地化的字符串不存在,那麼我想返回默認的語言字符串。Linq - 從列表中選擇項目或默認值

例如數據

Item MetaTag  LanguageCode Text 
1  Hello  en    Hello 
1  Hello  fr    Bonjour 
1  Hello  de    Guten Tag 
1  Goodbye  en    Goodbye 

,所以如果我想德國串,詞典應該包含

1  Hello  de    Guten Tag 
1  Goodbye  en    Goodbye 

所以我有以下代碼:

public interface ILocalisedItem 
{ 
    int ID { get; set; } 
    int ItemId { get; set; } 
    string MetaTag { get; set; } 
    string LanguageCode { get; set; } 
} 
public class ItemString : ILocalisedItem 
{ 
    int ID { get; set; } 
    int ItemId { get; set; } 
    string MetaTag { get; set; } 
    string LanguageCode { get; set; } 
    string Text {get; set; } 
} 

public static IDictionary<string, T> GetMetaDataDictionary<T> 
    (int ItemId, string DisplayLanguage, string DefaultLanguage) 
    where T : ILocalisedItem, new() 
{ 

    IEnumerable<T> metadata = GetMetaData<T>(ItemId); 

    ILookup<string, T> _lookup = metadata 
     .Where(z => (z.LanguageCode == DisplayLanguage) || (z.LanguageCode == DefaultLanguage)) 
     .OrderBy(x => (x.LanguageCode == DisplayLanguage) ? 0 : 1) 
     .ToLookup(o => o.MetaTag); 

    return _lookup.ToDictionary(y => y.Key.ToLower(), y => y.First()); 
} 

此代碼似乎工作,但我認爲必須有更好的方法來做到這一點。任何人都可以提供更好的解決方案。

+0

爲什麼不從數據庫發送過濾的數據?然後,只需使用返回的任何數據庫。 – danish

回答

0

你可以鞏固聲明的東西沿着線:

ILookup<string, T> _lookup = metadata 
    .Where(z => (z.LanguageCode == DisplayLanguage) || (z.LanguageCode == DefaultLanguage)) 
    .OrderBy(x => (x.LanguageCode == DisplayLanguage) ? 0 : 1) 
    .GroupBy(x => x.MetaTag) 
    .ToDictionary(x => x.ToLower(), y => y.First()); 

它不是一噸的清潔,但避免了額外的查找轉換。我認爲你們兩種方式的拉動和過濾將成爲拉動數據的最有效方式。直接進入詞典應該將第一個操作推回到數據庫,但不要在此引用我。

+0

好的,謝謝,這有點更好,讓我開心,我的方法也不錯。 – Sudmanche

0

可以使用DefaultIfEmpty使用自定義的參數:

ILookup<string, T> _lookup = metadata 
     .Where(z => (z.LanguageCode == DisplayLanguage) || (z.LanguageCode == DefaultLanguage)) 
     .DefaultIfEmpty(defaultLanguage) 
     .OrderBy(x => (x.LanguageCode == DisplayLanguage) ? 0 : 1) 
     .ToLookup(o => o.MetaTag); 

你必須提供一個變量defaultLanguage