集中服务层中的数据

时间:2016-09-01 14:54:28

标签: c#

请参阅此代码

public class MedierService : Singleton<MedierService>
{
    PresseEntities _db = new PresseEntities();
    IQueryable<Medier> _mediers;

    public MedierService()
    {
        _mediers = _db.Mediers.Select(s => s);
    }

    public List<Medier> GetAll(MedierStatus m)
    {
        var retVal = Enumerable.Empty<Medier>();
        switch (m)
        {
            case MedierStatus.New:
                retVal = _mediers.Where(w => w.vis == 1 && w.dato_slettet == new DateTime(1900, 01, 01));
                break;
            case MedierStatus.Deleted:
                retVal = _mediers.Where(w => w.vis == 1 && w.dato_slettet != new DateTime(1900, 01, 01));
                break;
        }
        return retVal.ToList();
    }
}

VS

public class MedierService : Singleton<MedierService>
{
    PresseEntities _db = new PresseEntities();

    IQueryable<Medier> _GetAll()
    {
        return _db.Mediers.Select(s => s);
    }

    public List<Medier> GetAll(MedierStatus m)
    {
        var retVal = Enumerable.Empty<Medier>();
        switch (m)
        {
            case MedierStatus.New:
                retVal = _GetAll().Where(w => w.vis == 1 && w.dato_slettet == new DateTime(1900, 01, 01));
                break;
            case MedierStatus.Deleted:
                retVal = _GetAll().Where(w => w.vis == 1 && w.dato_slettet != new DateTime(1900, 01, 01));
                break;
        }
        return retVal.ToList();
    }
}

好吧,所以上面的代码在调用MedierService.Instance.GetAll(MedierStatus.New)后都会返回相同的结果。

我对C#完全陌生,我希望我的代码有意义。

我在这里要做的是集中_mediers_GetAll,这样如果过滤器是全局的,我可以轻松过滤结果,所以我不必逐行并把过滤器。

现在我的问题是

我不知道我是否正确行事,在我的第一个例子中,我是通过使用构造函数创建并创建了一个变量_mediers,但是在第二个例子中我创建了一个名为{{1}的私有方法}。

所以这是我的问题: 1.)正确的做法是什么?第一个或下一个?

2。)是否可以使_GetAll()_mediers IQueryable,以便它不会加载我的数据库中的所有数据并让我的方法过滤它?

3.。)可以在下划线前加上我的方法_GetAll(),因为它是私有方法吗?

4。)无论如何你可以增强我的代码吗?

您的所有答案将极大地帮助我并提高我的编码技能。 非常感谢

1 个答案:

答案 0 :(得分:1)

只需要一个GetAll方法(即删除_GetAll方法,不需要构造函数)

public List<Medier> GetAll(MedierStatus m)
{
  var date = new DateTime(1900, 01, 01);
  var retVal = _db.Mediers
        .Where(w => w.vis == 1 && 
               ((w.dato_slettet == date && m == MedierStatus.New)
             || (w.dato_slettet != date && m == MedierStatus.Deleted)));


  return retVal.ToList();
}

至于指示私有方法的前缀,而是明确使用私有访问修饰符。

private IQueryable<Medier> GetAll() {...}