Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq:附加参数_C#_.net_Linq - Fatal编程技术网

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语句,所有的过滤都将在那里完成。你无法知道此筛选发生在数据库或内存中。这不是问题的一部分。