4

我已经搜索过这个问题的答案,但由于我相当缺乏经验,我什至可能不知道找到相关信息的正确关键字。抱歉,如果这是多余的...

我有一个数据库,其中包含几个具有相同结构的表 - 只是根据运动类型的不同命名:即 MLB_Games、NFL_Games 和 NCAAF_Games。在我的 C# 类中,我的逻辑以相同的方式应用于每个类,仅取决于我碰巧从事的运动。有没有办法声明一个列表,这样我就不必有 3 个不同的列表,为我正在从事的运动初始化一个,并且每次在我需要使用的逻辑中都有一个 switch 语句数据?

这是帮助理解问题的初始化代码。只声明一个 List dbGames,填充它,然后在其余逻辑中使用它会容易得多。这可能吗?如果我尝试只使用 var,我会收到一个错误,即必须初始化隐式类型的局部变量。

List<MLB_Games> dbMlbGames;
List<NCAAF_Games> dbNcaafGames;
List<NFL_Games> dbNflGames;

using (var dbContext = new SportsProjectXEntities(Properties.Settings.Default.currentEntityConnString))
{
    switch (sport)
    {
        case "MLB":
            dbMlbGames = dbContext.MLB_Games.ToList();
            break;
        case "NCAAF":
            dbNcaafGames = dbContext.NCAAF_Games.ToList();
            break;
        case "NFL":
            dbNflGames = dbContext.NFL_Games.ToList();
            break;
        default:
            Logger.Instance.LogMessage("Cannot initialize the requested sport: " + sport);
            break;
    }
}
4

1 回答 1

2

通过接口抽象您的实体,例如:

class MLB_Games : IGames
{
    public string Name { get; set; }
}
class NCAAF_Games : IGames
{
    public string Name { get; set; }
}
class NFL_Games : IGames
{
    public string Name { get; set; }
}
interface IGames
{
    string Name { get; set; }
}

创建属性

List<IGames> games;

然后根据它们的类型加载实体(switch如果你愿意,你可以使用而不是字典。偏好问题):

var gamesLoaders = new Dictionary<string, Func<IQueryable<IGames>>>
{
    {"MLB", () => dbContext.MLB_Games},
    {"NCAAF", () => dbContext.NCAAF_Games},
    {"NFL", () => dbContext.NFL_Games}
};

var sport = "MLB";

if(gamesLoaders.ContainsKey(sport))
    games = gamesLoaders[sport]().ToList();
else
    Logger.Instance.LogMessage("Cannot initialize the requested sport: " + sport);

现在您可以使用一个games. 请注意,您应该为每个具体实体添加特定行为并通过IGames接口公开它。

编辑: 如果您使用模型优先方法并生成实体,则可以使用部分类在单独的文件中定义接口实现。EF 已经将partial关键字插入到生成的类中。例如,您可以定义:

public partial class MLB_Games : IGames
{
    //interface implementation is defined in generated file
}

现在 C# 编译器将结合这个定义和 EF 生成的定义。当您从 edmx 模型更新实体时,此文件不会受到影响。

于 2013-09-17T10:31:30.770 回答