1

我认为使用 linq 到对象的查询最终会变得非常可读和美观。例如:

from person in db.Persons.ToList()
where person.MessageableBy(currentUser) ...

其中 MessageableBy 是一种无法转换为存储表达式 (sql) 的方法

    public bool MessageableBy(Person sender)
    {
        // Sender is system admin
        if (sender.IsSystemAdmin())
            return true;

        // Sender is domain admin of this person's domain
        if (sender.Domain.DomainId == this.Domain.DomainId && this.Domain.HasAdmin(sender))
            return true;

        foreach (Group group in this.Groups)
        {
            if (group.MessageableBy(sender)) 
                return true;
        }

        // The person is attorney of someone messageable
        if (this.IsAttorney)
        {
            foreach (Person pupil in this.Pupils)
                if (pupil.MessageableBy(sender)) 
                    return true;
        }

        return false;
    }

问题是我认为这不会扩大规模。我已经注意到数据库中有一些条目,所以无法想象大型数据库。

所以问题是: 我是否应该将 linq 与 linq 与对象混合(即:将一些“where”应用于 ICollection 并将一些“where”应用于 .ToList() 结果?我应该只使用 linq到实体,以一个非常大的句子结尾?

4

3 回答 3

2

.ToList()实际上将执行查询并获取该表中的所有数据,除非您确定它总是很少的记录,否则这不是您想要的。所以是的,在做之前你应该在where子句中做更多.ToList()

于 2013-04-12T17:53:53.023 回答
0

我基本同意你的初步分析。将 Linq to Objects 和 Linq to Entities 混合使用很好,但需要检索比必要更多的数据,因此可能会导致扩展问题。

请记住设计您的数据模型以支持关键查询。也许一个用户可以是一个人,而这个人可以有一个确定谁可以向谁发送消息的自我关系。这只是一个简单的想法,以启发您考虑其他表示数据的方法,以允许在查询本身中实现 ​​MessableBy 方法。

同时,如果它没有引起性能问题,那么我会在模型设计方面更多地考虑这个问题。

于 2013-04-12T18:00:56.787 回答
0

尽管这只是简单地解释了早期受访者的陈述,但我认为真正强调以下内容非常重要:

在将结果数据发送到客户端之前,在 DB 服务器上执行尽可能多的计算,尤其是尽可能多的过滤和聚合,对于 DB 应用程序性能至关重要。

于 2013-04-12T18:01:16.923 回答