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

时间:2020-03-05 18:59:26  来源:igfitidea点击:

我试图从我在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内容的方法吗?也许我正在解决所有错误,任何建议将不胜感激。

哈尔

解决方案

回答

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

作为附带说明,我们如何通过markdown做到这一点?

Users.OfType<ActiveUsers>

我可以用代码获得,但不能内联

回答

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

回答

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

from t in _db.Table

  select t;

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

回答

也许我对凯文·谢菲尔德(Keven Sheffield)的回应的评论可能使我想尽力实现以下目标:

I have a similar repository for most
  of my data access, but I am trying to
  be able to traverse my relationships
  and maintain the DeletedOn logic,
  without actually calling any
  additional methods. The objects are
  interrogated (spelling fixed) by a StringTemplate
  processor which can't call methods
  (just props/fields).

最终,我将为我的应用程序中的所有表都需要DeletedOn过滤。尽管我需要弄清楚如何在"派生类区分值"属性中检查空值,但S​​cott Nichols的继承类解决方案应该可以工作(尽管我将需要为大约30个表ouch派生一个类和关系)。

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

回答

另一种方法是使用视图。

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

就linq to sql而言,它与表相同。对于需要DeletedOn筛选的任何表,只需创建一个使用该筛选器的视图,然后在数据上下文中使用该视图代替该表。

回答

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

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

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

回答

封装DataContext,以便开发人员在查询中不使用Table。我的存储库上有一个"全部"属性,它可以对我们所需的内容进行类似的过滤。所以查询就像:

from item in All
where ...
select item

可能都是:

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

回答

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

谢谢,我稍后会更新。