在LINQ中动态选择表

时间:2014-08-03 10:41:46

标签: c# asp.net-mvc linq

我正在开发一个多元文化网站,在某些情况下,我需要能够根据所选文化从不同的表格中读取数据。这是一个例子:

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存储库模式吗?

2 个答案:

答案 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类来添加表,但除了名称之外   两个班级完全相同。


重构您的数据库方案。目前,您将NewsENNewsRU视为两个不同的对象,尽管它们包含完全相同的属性。因此,我建议您不要为NewsENNewsRU提供表格,而只需要一个表格(News),并添加一个名为&#的额外字段34;文化&#34;

然后你可以这样做:

var culture = Thread.CurrentThread.CurrentUICulture.ToString();
var data = db.News.Where(x => x.Culture == culture);

这将根据当前文化获取News条记录。这也使得以后可以与其他文化一起扩展。您需要做的就是在添加News记录时将文化设置为其他内容。