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 内容的方法 - 我试图确定在任何地方访问我的 Users 表时,它不会返回那些标记为已删除的。也许我对这一切都错了 - 任何建议将不胜感激。

哈尔

4

8 回答 8

2

另一种方法是使用视图..

CREATE VIEW ActiveUsers as SELECT * FROM Users WHERE IsDeleted = 0

就 linq to sql 而言,这与表相同。对于您需要 DeletedOn 过滤的任何表,只需创建一个使用过滤器的视图,并在数据上下文中使用它来代替表。

于 2008-09-17T18:09:58.770 回答
1

您可以在表上使用鉴别器列继承,即。一个 DeletedUsers 表和 ActiveUsers 表,其中鉴别器列说明哪个去哪个。然后在您的代码中,只需引用 Users.OfType ActiveUsers,它永远不会包含任何已删除的内容。

作为旁注,你到底是如何使用降价来做到这一点的?

Users.OfType<ActiveUsers>

我可以在代码中得到它,但不能内联

于 2008-09-17T17:15:49.570 回答
1

封装您的 DataContext 以便开发人员不会在他们的查询中使用 Table。我的存储库中有一个“全部”属性,可以根据您的需要进行类似的过滤。那么查询就像:

from item in All
where ...
select item

一切都可能是:

public IQueryable<T> All
{
    get { return MyDataContext.GetTable<T>.Where(entity => !entity.DeletedOn.HasValue); }
}
于 2008-09-18T01:17:46.340 回答
0

您可以使用存储过程返回表中所有未标记为已删除的记录的所有映射列,然后将 LINQ to SQL 类映射到存储过程的结果。我认为您只需将服务器资源管理器中的存储过程拖放到 LINQ to SQL 设计器中的类上。

于 2008-09-17T17:19:20.623 回答
0

在这种情况下我所做的是我创建了一个传递回 IQueryable 的存储库类,但基本上只是

从 _db.Table 中的
t 选择 t;

这通常由 tableRepository.GetAllXXX() 引用;但你可以有一个 tableRepository.GetAllNonDeletedXXX(); 这放入了初步的 where 子句以取出已删除的行。这将允许您使用不同的方法取回已删除的、未删除的和所有行。

于 2008-09-17T17:26:22.773 回答
0

也许我对凯文谢菲尔德的回应的评论可能会对我想要完成的事情有所帮助:

我的大部分数据访问都有一个类似的存储库,但我试图能够遍历我的关系并维护 DeletedOn 逻辑,而无需实际调用任何其他方法。对象由不能调用方法(只是道具/字段)的 StringTemplate 处理器询问(拼写固定)。

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

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

于 2008-09-17T17:49:27.710 回答
0

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

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

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

于 2008-09-17T23:15:32.857 回答
0

我发现了视图中未显示的关系/关联的问题。似乎您必须遍历 dbml 中的每个类并为视图设置主键,因为它无法从模式中提取该信息。我现在正在设置主键,并计划走查看路线以仅隔离未删除的项目。

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

于 2008-09-18T13:50:38.243 回答