文档数据库 - 按接口属性实现类型查询

时间:2014-03-20 11:07:56

标签: c# nosql ravendb document-database

在我们的应用程序中,我们有一个Ship对象,可以为Ship分配Jobs。每个Job都有一个WorkRole,描述了Ship正在做的工作。

以下是我的课程:

public class Job
{
    public string ShipId { get; set; }
    public IWorkRole WorkRole { get; set; }
    public DateTimeOffset Start { get; set; }
    public DateTimeOffset End{ get; set; }
}

public class Ship
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public interface IWorkRole
{
    string Comments { get; set; }
}

public class RigMoveWorkRole : IWorkRole
{
    public string Comments { get; set; }
    public string RigId { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

可以有许多不同类型的WorkRole,每个都有不同的属性。

我希望能够通过WorkRole查询Ships Jobs。因此,例如查询执行RigMoveWorkRole的Ship的所有作业。

这种方法是一种很好的建模方法,因为我不确定是否可以通过对象类型进行查询是一个很好的解决方案,尽管可以使用RavenDB完成。我想在每个WorkRole中嵌入一个Enum,所以我可以轻松地使用它来查询,例如:

public interface IWorkRole
{
    WorkRoleType WorkRoleType { get; }
    string Comments { get; }
}

public abstract class WorkRoleBase : IWorkRole
{
    public WorkRoleType WorkRoleType { get; private set; }
    public string Comments { get; protected set; }

    protected WorkRoleBase(WorkRoleType type)
    {
        WorkRoleType = type;
    }
}

public class AllDutiesWorkRole : WorkRoleBase
{
    public AllDutiesWorkRole(string comments) : base(WorkRoleType.AllDuties)
    {
        Comments = comments;
    }
}

public class RigMoveWokRole : WorkRoleBase
{
    public string RigId { get; private set; }

    public RigMoveWokRole(string rigId, string comments) : base(WorkRoleType.RigMove)
    {
        RigId = rigId;
        Comments = comments;
    }
}

public enum WorkRoleType
{
    RigMove,
    AllDuties
}

这样我就可以查询Job类上的IWorkRole.WorkRoleType接口属性:

Session.Query<Job>().Where(x => x.WorkRole.WorkRoleType == WorkRoleType.RigMove);

任何人都可以看到这个模型有任何问题,或者有更好的方法可以做到这一点吗?

谢谢!

0 个答案:

没有答案