我认为使用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实体,以一个非常大的句子结尾?
答案 0 :(得分:2)
.ToList()
实际上会执行查询并获取该表中的所有数据,这不是您想要的,除非您确定它始终是少量记录。所以,是的,在执行where
.ToList()
子句中执行更多操作
答案 1 :(得分:0)
我基本同意你的初步分析。将Linq混合到对象和Linq到实体是很好的,但需要检索比必要的更多的数据,因此可能导致在未来的扩展问题。
请记住设计数据模型以支持关键查询。也许一个用户可能是一个人,而一个人可能有一个自我关系,决定谁可以告诉谁。这只是一个简单的想法,可以激发您考虑表示数据的其他方式,以允许在查询本身中实现MessableBy方法。
与此同时,如果它不会导致性能问题,那么我会在模型设计方面更多地考虑这个问题。
答案 2 :(得分:0)
虽然这简单地解释了早期受访者的陈述,但我认为足以真正强调这一点非常重要:
对于数据库应用程序性能而言,在将结果数据发送到客户端之前,在数据库服务器上执行尽可能多的计算,尤其是尽可能多的过滤和聚合,这一点至关重要。