我是否滥用Linq对象?

时间:2013-04-12 17:52:04

标签: performance linq entity-framework

我认为使用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实体,以一个非常大的句子结尾?

3 个答案:

答案 0 :(得分:2)

.ToList()实际上会执行查询并获取该表中的所有数据,这不是您想要的,除非您确定它始终是少量记录。所以,是的,在执行where

之前,您应该在.ToList()子句中执行更多操作

答案 1 :(得分:0)

我基本同意你的初步分析。将Linq混合到对象和Linq到实体是很好的,但需要检索比必要的更多的数据,因此可能导致在未来的扩展问题。

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

与此同时,如果它不会导致性能问题,那么我会在模型设计方面更多地考虑这个问题。

答案 2 :(得分:0)

虽然这简单地解释了早期受访者的陈述,但我认为足以真正强调这一点非常重要:

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