我正在开发一个多元文化网站,在某些情况下,我需要能够根据所选文化从不同的表格中读取数据。这是一个例子:
IEnumerable<NewsEN> dataEN;
IEnumerable<NewsRU> dataRU;
if (Thread.CurrentThread.CurrentUICulture.ToString() == "en")
dataEN = db.NewsEN.ToList();
else
data = db.NewsRU.ToList();
//Won't let me do this because implicit conversion isn't allowed here
var result = dataEN != null ? data : dataRU;
//Here's the important part where I want to stick the result in
var model = result.Select(....
(我知道这看起来像菜鸟一样)
到目前为止我尝试过的是Automapper。它不仅不起作用,对于这样一个简单的任务来说似乎也是一种过度杀伤,所以我们分道扬.. 我也考虑过Dynamic Linq lib - 虽然没有尝试过 第三个选项是执行sql命令,将表名作为变量,我可以从If语句中获取。
此外,有20种方法必须依赖该代码 - 我应该看一些smartass存储库模式吗?
答案 0 :(得分:3)
在NewsEN和NewsRU上实施界面并使用IEnumerable<INews>
或IQueryable<INews>
。如果要将查询提取为方法,则可以使用约束为INews的泛型。
示例:
interface INews
{
DateTime PublishDate { get; }
}
class NewsRU : INews
{
public string Text {get; set; }
public DateTime PublishDate {get; set;}
}
...
public static void IQueryable<T> GetTodaysNews<T>(this IQueryable<T> source) where T:INews
{
return from n in source
where n.PublishDate > DateTime.Now.Date
select n;
}
...
result.GetTodaysNews(); //whatever result is it will work
另请注意,您应该考虑使用一个新闻表并将该语言作为该表中的列。虽然有时候更频繁地使用不同的表,但您会希望将数据放在一个表中,将语言作为列。
答案 1 :(得分:0)
这些课程不会从任何事物中继承。我先使用代码,所以我 只创建了NewsRU类来添加表,但除了名称之外 两个班级完全相同。
重构您的数据库方案。目前,您将NewsEN
和NewsRU
视为两个不同的对象,尽管它们包含完全相同的属性。因此,我建议您不要为NewsEN
和NewsRU
提供表格,而只需要一个表格(News
),并添加一个名为&#的额外字段34;文化&#34;
然后你可以这样做:
var culture = Thread.CurrentThread.CurrentUICulture.ToString();
var data = db.News.Where(x => x.Culture == culture);
这将根据当前文化获取News
条记录。这也使得以后可以与其他文化一起扩展。您需要做的就是在添加News
记录时将文化设置为其他内容。