C# 使用索引器从数据存储中检索Linq to SQL对象

C# 使用索引器从数据存储中检索Linq to SQL对象,c#,linq-to-sql,orm,collections,indexer,C#,Linq To Sql,Orm,Collections,Indexer,我们团队中的一位开发人员认为,在上述情况下使用索引器是不合适的,应该首选GetUser(Guid id)方法 理由是: 1) 我们不是在内存集合中建立索引,索引器基本上是在执行隐藏的SQL查询 2) 在索引器中使用Guid是错误的(FxCop也将此标记为错误) 3) 从索引器返回null不是正常行为 4) API用户通常不会期望出现这种行为 我在某种程度上同意(大部分)这些观点 但我也倾向于认为Linq的一个特点是抽象数据库访问,使其看起来只是处理一组集合,即使惰性评估范式意味着在对这些集合运行

我们团队中的一位开发人员认为,在上述情况下使用索引器是不合适的,应该首选
GetUser(Guid id)
方法

理由是:

1) 我们不是在内存集合中建立索引,索引器基本上是在执行隐藏的SQL查询 2) 在索引器中使用Guid是错误的(FxCop也将此标记为错误) 3) 从索引器返回
null
不是正常行为 4) API用户通常不会期望出现这种行为

我在某种程度上同意(大部分)这些观点

但我也倾向于认为Linq的一个特点是抽象数据库访问,使其看起来只是处理一组集合,即使惰性评估范式意味着在对这些集合运行查询之前不会对它们进行评估。在我看来,以相同的方式访问数据存储并不是不一致的,就好像它是一个具体的内存集合一样

还要记住,这是一个继承的代码库,广泛且一致地使用此模式,是否值得重构?我承认从一开始就使用Get方法可能更好,但我还不认为使用索引器是完全不正确的


我很想听听大家的意见,谢谢。

我认为他关于使用GUID作为索引器的观点可能是指它存储在数据库中。与使用guid相比,使用整数作为键将提供更好的性能并占用更少的存储空间

与索引器一样,返回null是非常少见的,如果索引(键)不在集合中,则会引发异常

就我个人而言,我并没有真正看到这里的问题,它几乎相当于拥有一个
GetUser
方法。我的意思是,如果你想把它整理一下,你实际上可以引入一个名为
GetUser
的私有方法,索引器可以调用它,例如

class UserDatastore : IUserDatastore
{
    ...

    public IUser this[Guid userId]
    {
        get
        {
            User user = (from u in _dataContext.Users
                             where u.Id == userId
                             select u).FirstOrDefault();

            return user;
        }
    }

    ...
}

从设计的角度来看,我个人不会使用索引器,我会使用
GetUser
方法。

我认为他关于使用GUID作为索引器的观点可能是指它存储在数据库中。与使用guid相比,使用整数作为键将提供更好的性能并占用更少的存储空间

与索引器一样,返回null是非常少见的,如果索引(键)不在集合中,则会引发异常

就我个人而言,我并没有真正看到这里的问题,它几乎相当于拥有一个
GetUser
方法。我的意思是,如果你想把它整理一下,你实际上可以引入一个名为
GetUser
的私有方法,索引器可以调用它,例如

class UserDatastore : IUserDatastore
{
    ...

    public IUser this[Guid userId]
    {
        get
        {
            User user = (from u in _dataContext.Users
                             where u.Id == userId
                             select u).FirstOrDefault();

            return user;
        }
    }

    ...
}

从设计角度来看,我个人不会使用索引器,我会使用
GetUser
方法。

我倾向于同意团队开发人员建议的几乎所有内容,除了
Guid
部分。如果这里有任何问题,必须在数据库级别考虑性能,而不是在代码中

我个人认为属性和索引器不应该隐藏长时间运行的操作,尽管
用户可以通过linqtosql缓存。这就是为什么我更喜欢一种方法


我也同意从索引器返回null是不好的。抛出异常。

除了
Guid
部分之外,我倾向于同意团队开发人员建议的几乎所有内容。如果这里有任何问题,必须在数据库级别考虑性能,而不是在代码中

我个人认为属性和索引器不应该隐藏长时间运行的操作,尽管
用户可以通过linqtosql缓存。这就是为什么我更喜欢一种方法


我也同意从索引器返回null是不好的。改为抛出异常。

谢谢您的评论。不过,我看不出你建议的重构有什么好处,当然要么保持原样,要么完全删除索引器。你既没有改变内在行为,也没有改变外在行为。除非我没抓住重点。@Fearofahackplanet:如果你读了我的帖子,我说如果你想整理的话。唯一的好处是可维护性和更干净的代码。我通常不喜欢把那么多代码放在getter中。谢谢你的评论。不过,我看不出你建议的重构有什么好处,当然要么保持原样,要么完全删除索引器。你既没有改变内在行为,也没有改变外在行为。除非我没抓住重点。@Fearofahackplanet:如果你读了我的帖子,我说如果你想整理的话。唯一的好处是可维护性和更干净的代码。我通常不喜欢把那么多代码放在getter中。关于长时间运行的操作-数据库查询不可能像内存中的查询一样快,因为连接已经建立了吗?关于长时间运行的操作-数据库查询不可能像内存中的查询一样快,既然已经建立了连接?