限制 System.Data.Linq.Table<T> 的结果

3
我正在尝试从我的LinqToSQL生成的数据上下文中继承 - 就像这样。
public class myContext : dbDataContext {
 public System.Data.Linq.Table<User>() Users {
  return (from x in base.Users() where x.DeletedOn.HasValue == false select x);
 }
}

但是我的Linq语句返回的是IQueryable,无法转换为Table - 有人知道限制Linq.Table内容的方法吗?我试图确保在任何访问我的用户表的地方,它不会返回那些被标记为删除的内容。也许我的做法不对 - 有什么建议将不胜感激。
Hal
8个回答

2
另一种方法是使用视图(views)...
CREATE VIEW ActiveUsers as SELECT * FROM Users WHERE IsDeleted = 0

就 Linq to SQL 而言,它只是一个表格。对于任何需要 DeletedOn 过滤的表格,只需创建一个使用该过滤器的视图,并在数据上下文中使用该视图替换表格即可。


可能有一个优点,就是我仍然可以每个表维护一个单一的类,并从dbml中删除我的原始数据。感谢您的帮助...我会尝试一段时间这种方法,看看我能得出什么结论。 - Hal

1
你可以在表上使用鉴别器列继承,即一个 DeletedUsers 表和一个 ActiveUsers 表,其中的鉴别器列指定哪个属于哪个表。然后在你的代码中,只需引用 Users.OfType ActiveUsers,这将永远不会包括任何已删除的内容。
另外一提,如何使用 Markdown 实现这个功能?
Users.OfType<ActiveUsers>

我可以在代码中获取它,但不能内联获取


感谢您的积极回应。我正在尝试看看能否使用这个解决方案。您是否知道如何检查派生类鉴别器值属性的空值? - Hal
我以前没有太多使用过这个,所以现在正在尝试一下。我会更新我发现的内容。 - Scott Nichols
看起来 InheritanceDefault 属性应该处理这个问题,但它的工作方式并不完全符合我的预期。 - Scott Nichols
这是继承的误用。 - liammclennan

1

封装您的DataContext,以便开发人员在查询中不使用Table。 我的存储库上有一个“All”属性,它执行类似于您所需过滤的操作。 因此,查询看起来像这样:

from item in All
where ...
select item

而所有可能的情况是:

public IQueryable<T> All
{
    get { return MyDataContext.GetTable<T>.Where(entity => !entity.DeletedOn.HasValue); }
}

我会再仔细考虑一下。上面的代码(或类似的代码)是否能确保我可以遍历关系并仍将它们限制为未标记删除的关系?看起来应该可以,但我会试一试。我想我会将所有关系映射到我的存储库类中。谢谢。 - Hal

0

您可以使用一个存储过程,返回表中所有未标记为删除的记录的映射列,然后将LINQ to SQL类映射到存储过程的结果。我认为您只需在Server Explorer中将存储过程拖放到LINQ to SQL设计器中的类上即可。


0
在这种情况下,我创建了一个仓储类,它返回IQueryable,但基本上只是从_db.Table中选择t。通常通过tableRepository.GetAllXXX()引用它;但是你可以有一个tableRepository.GetAllNonDeletedXXX(),它会放入那个预备的where子句来删除已删除的行。这将允许您使用不同的方法获取已删除的行、未删除的行和所有行。

我有一个类似的存储库来访问我的大多数数据,但我正在尝试能够遍历我的关系并维护DeletedOn逻辑,而不实际调用任何其他方法。这些对象由StringTemplate处理器整合,该处理器无法调用方法(只能调用属性/字段)。 - Hal

0

也许我对Keven Sheffield的回复的评论可以阐明我想要实现什么:

我有一个类似的存储库来访问我的大部分数据,但是我想能够遍历我的关系并保持DeletedOn逻辑,而不必调用任何其他方法。这些对象由StringTemplate处理器进行询问(拼写已更正),它不能调用方法(只能调用属性/字段)。

最终我需要在应用程序中的所有表格中使用此DeletedOn过滤。Scott Nichols的继承类解决方案应该可行(尽管我需要为大约30个表派生一个类和关系 - 疼),尽管我需要弄清楚如何检查Derived Class鉴别器值属性中的空值。

我可能最终会为StringTemplate处理专门扩展所有类,明确添加我需要的关系属性,我只是希望能够向StringTemplate抛出一个[user]并让它遍历所有内容。


0

在关联中,我们使用了几个视图,它们仍然像任何其他关系一样出现。我们确实需要手动添加关联。我能想到的唯一建议是查看为这些类和关联生成的属性和装饰属性。

添加几个具有相同关系的表,并将其与未显示的视图进行比较。

此外,有时服务器资源管理器连接上的刷新似乎无法正常工作,实体最初创建不正确,除非我们从设计器中删除它们,关闭项目,然后重新打开项目并从服务器资源管理器中再次添加它们。这是假设您正在使用带有linq to sql .dbml设计器的Visual Studio 2008。


0

我发现了一个问题,即关系/关联在视图中没有显示。看起来你必须通过dbml中的每个类并为视图设置一个主键,因为它无法从模式中提取该信息。我正在设置主键,并计划走视图路线以仅隔离非删除项。

谢谢,稍后我会更新更多内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接