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

时间:2008-09-17 17:09:57

标签: linq-to-sql

我试图从LinqToSQL中生成的datacontext继承 - 类似这样的

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表的任何地方,它都不会返回那些标记已删除。也许我认为这一切都是错的 - 任何建议都会非常感激。

哈尔

8 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

Users.OfType<ActiveUsers>

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

答案 2 :(得分:1)

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

from item in All
where ...
select item

所有可能是:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

  

来自_db.Table中的t   选择t;

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

答案 5 :(得分:0)

也许我对Keven sheffield的回应的评论可能会对我想要实现的目标有所启发:

  

我有大多数类似的存储库   我的数据访问权限,但我正在尝试   能够遍历我的人际关系   并维护DeletedOn逻辑,   没有实际调用任何   其他方法。对象是   通过StringTemplate查询(拼写固定)   处理器无法调用方法   (只是道具/领域)。

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

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

谢谢,我稍后会更新。