C# Linq:附加参数
我有以下几行:C# Linq:附加参数,c#,.net,linq,C#,.net,Linq,我有以下几行: orderBaseData.Single(o => o.Id == order.Id).OrderMessages.Count; 我想再过滤一下。每个OrderMessage都有一个名为hideFromUser的变量,我想获取OrderMessages的计数,其中该值仅设置为FALSE 提前感谢, Bob使用Where on OrderMessages orderBaseData .Single(o => o.Id == order.Id) .OrderMe
orderBaseData.Single(o => o.Id == order.Id).OrderMessages.Count;
我想再过滤一下。每个OrderMessage都有一个名为hideFromUser的变量,我想获取OrderMessages的计数,其中该值仅设置为FALSE
提前感谢,
Bob使用Where on OrderMessages
orderBaseData
.Single(o => o.Id == order.Id)
.OrderMessages
.Where(x => !x.hideFromUser)
.Count();
为了在单个查询中高效地检索数据,您可以使用以下方法,而不是在以后懒散地加载OrderMessages:
orderBaseData
.Where(o => o.Id == order.Id)
.Select(o => o.OrderMessages.Where(x => !x.hideFromUser).Count())
.Single();
当orderBaseData以数据库为目标时,这种方法最为有趣。如果所有数据都已在内存中,那么它实际上并不比其他方法更好或更差。
orderBaseData.Single(o=>o.Id==order.Id).OrderMessages.Count(om=>!om.hideFromUser)
如果此查询针对数据库(例如,如果您使用实体框架或其他ORM工具),则最好使用类似于orderBaseData.Where(o=>o.Id==order.Id)。SelectMany(o=>o.OrderMessages)。Where(m=>!m.hideFromUser)。Count()
只对数据库执行一次查询。@Evk这实际上不会强制执行单个
约束。@grek40虽然为true,但在几乎所有情况下都不需要单个
约束。例如,我打赌在这种情况下,order表在order id上有唯一的索引(无论如何都应该有这样的索引),所以查询不能返回多个order。这是实体框架还是linq to对象?您可以通过在count语句中写入predictate来压缩它:orderBaseData.Single(o=>o.id==order.id)。OrderMessages.count(x=>!x.hideFromUser);
在ID字段上进行过滤会返回单个对象,而不是多个对象,这一点是理所当然的。OP使用.single()
,这就隐式地证实了这一点。我不明白你为什么把问题中的.single()
改为。Where()
,我看不出任何理由。这使得你的答案的其余部分变得不必要的复杂,没有任何明显的好处。@Flater我在选择之前过滤,因为否则我需要将Id
保留在所选属性中。这样,我可以选择count作为唯一的值-这不是真正的值适合作为单个
中的筛选器。当您确定筛选只会产生单个结果时,使用.Where()
有什么意义?您不必要将该结果包装到IEnumerable中。我的观点是,您甚至不需要选择()
语句。您的答案不必要地做作。反建议:orderBaseData.Single(o=>o.Id==order.Id)。OrderMessages.Where(x=>!x.hideFromUser).Count()
。我只是删除了不必要的IEnumerable包装及其后果。Single
的结果是不可iquirable
的,因此我相信这个答案试图使查询只生成一条SQL语句,所有的过滤都将在那里完成。你无法知道此筛选发生在数据库或内存中。这不是问题的一部分。