3

我的 sql 数据库中有一个名为“Clients”的表,该表中有一个名为 status 的字段。它可以包含 2 个值,“A”表示活动或“I”表示非活动。同时,在我使用 Entity Framework v5 的 mvc Web 应用程序中,我已经使用特定的 ClientRepository 实现了存储库模式。

每当我调用 ClientRepository 时,都会有一个预定义的过滤器确保过滤所有查询并且只返回状态“A”记录......一切都很好。

我现在面临的问题是,当我使用 LINQ 查询链接到客户端的表时,例如 - ClientOrders,然后访问名为 Clients 的导航属性。当我这样做时,它会检索所有具有任何“状态”的客户端,包括“我”。

有谁知道是否有办法在设计器或上下文中配置 EF 以设置导航属性的条件以满足我的要求,以便只返回状态“A”?

请注意,这是我的应用程序中使用“状态”作为记录指示器的许多情况的一个示例,并且有多个导航属性需要应用修复。

谢谢。

4

2 回答 2

3

您可以使用 LINQ 查询来实现此目的。这是执行此操作的示例:

var clientOrders = _context.ClientOrders    
    .Select(item => new {
        ClientOrders = item,
        Clients = item.Clients.Where(q => q.Status == "A")
    }).ToList();

这将返回一个新匿名类型的列表。执行此查询后,您可以将匿名结构转换为 ClientOrders。

于 2013-10-04T04:44:30.530 回答
0

听起来您可能正在尝试实施软删除。这里有一个解决方案 https://stackoverflow.com/a/18985828/150342

但这意味着状态字段只能使用 sql....

也许你可以使用继承?因此,您将拥有ActiveClientsandInActiveClients并且HyperActiveClients全部继承自 abstract BaseClient。然后,您无需设置状态,而是将其从一种类型转换为另一种类型。

编辑想一想,转换并不是那么简单。您不能只将一个转换为另一个,您必须删除ActiveClient并创建一个新的InActiveClient,并且由于外键约束等原因,这可能不是微不足道的......

于 2013-10-04T04:17:51.680 回答