Linq to sql 系统数据Linq表的极限结果<;T>;

Linq to sql 系统数据Linq表的极限结果<;T>;,linq-to-sql,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); } } 公共类myContext:dbDataContext{ p

我正在尝试从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);
 }
}
公共类myContext:dbDataContext{
public System.Data.Linq.Table()用户{
返回(从base.Users()中的x返回,其中x.DeletedOn.HasValue==false选择x);
}
}
但我的Linq语句返回的IQueryable不能强制转换到表中-有人知道限制Linq.Table内容的方法吗-我正在尝试确保在访问我的Users表的任何地方,它都不会返回标记为deleted的内容。也许我完全错了——任何建议都将不胜感激


Hal

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

顺便提一下,你到底是怎么做的

Users.OfType<ActiveUsers>
Users.OfType

我可以在代码中获得它,但不是内联的

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

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

来自t in_db.Table
选择t


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

也许我对Keven sheffield回复的评论可以帮助您了解我正在努力实现的目标:


我有一个类似的存储库 我的数据访问权限,但我正在尝试 能够穿越我的人际关系 并保持DeletedOn逻辑, 没有打任何电话 其他方法。对象是 由StringTemplate查询(拼写固定) 无法调用方法的处理器 (只是道具/场地)

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


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

另一种方法是使用视图

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

就LINQtoSQL而言,这与表是一样的。对于任何需要DeletedOn筛选的表,只需创建一个使用筛选器的视图,并在数据上下文中使用该视图来代替该表。

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

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


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

封装您的DataContext,以便开发人员在查询中不使用表。我的存储库中有一个“All”属性,它可以根据您的需要进行类似的过滤。因此,查询如下所示:

from item in All
where ...
select item
所有这些都可能是:

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

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


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

谢谢您的回复。我在试着看看我是否能用这个方法解决这个问题。你知道如何检查派生类鉴别器值属性的空值吗?我以前没有用过很多,所以我现在就在玩这个。我将根据我发现的情况进行更新。看起来InheritanceDefault属性应该能够处理此问题,但没有像我预期的那样正常工作。这是对继承的滥用。我的大部分数据访问都有一个类似的存储库,但我正试图遍历我的关系并维护DeletedOn逻辑,没有实际调用任何其他方法。对象由StringTemplate处理器集成,该处理器不能调用方法(只调用props/fields)。这样做可能有一个好处,因为我仍然只能为每个表维护一个类,并从dbml中删除我的原始类。谢谢你的帮助。。。我会研究一下这个方法,看看我能想出什么。我会再考虑一下这个方法。上述代码(或类似代码)是否确保我可以遍历关系,并且仍然将它们限制在未标记为“已删除”的关系中?我想它会的,看着它,但会尝试一下。我想我会画出所有的关系图