Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 如何在循环中附加IQueryable_C#_Entity Framework_Webforms - Fatal编程技术网

C# 如何在循环中附加IQueryable

C# 如何在循环中附加IQueryable,c#,entity-framework,webforms,C#,Entity Framework,Webforms,我有一个简单的foreach循环,它遍历我存储在用户篮子中的productID,并从数据库中查找产品的详细信息 正如您可以从我的代码中看到的,我目前拥有的将返回屏幕上的最后一项——因为变量在循环中被覆盖。我希望能够对此进行concat,这样我就可以只显示篮子中项目的产品详细信息 我知道我可以做一些非常简单的事情,比如在我使用的中继器中只存储ProductID,然后在那里调用数据库,但是如果可能的话,我只想进行一次数据库调用 目前,我有以下内容(从示例中删除了复杂连接,但如果这很重要,请告诉我):

我有一个简单的foreach循环,它遍历我存储在用户篮子中的productID,并从数据库中查找产品的详细信息

正如您可以从我的代码中看到的,我目前拥有的将返回屏幕上的最后一项——因为变量在循环中被覆盖。我希望能够对此进行concat,这样我就可以只显示篮子中项目的产品详细信息

我知道我可以做一些非常简单的事情,比如在我使用的中继器中只存储ProductID,然后在那里调用数据库,但是如果可能的话,我只想进行一次数据库调用

目前,我有以下内容(从示例中删除了复杂连接,但如果这很重要,请告诉我):

谢谢你的帮助

听起来你真的想要这样的东西:

var productIds = store.BasketItems.Select(x => x.ProductID).ToList();
var query = from p in db.Products
            where p.Active && productIds.Contains(p.ProductID)
            select new
            {
                p.ProductID,
                p.ProductName,
                p.BriefDescription,
                p.Details,
                p.ProductCode,
                p.Barcode,
                p.Price
            };

在Jon的答案中,虽然效果很好,但IQueryable将被转换为IEnumerable,因为您对它调用了ToList()。这将导致执行查询并检索答案。对于您的情况,这可能是可以的,因为您希望为一个篮子检索产品,并且产品的数量可能非常少

然而,我也面临着类似的情况,我想为一名会员找回朋友。友谊取决于两个成员所属的团体——如果他们至少共享一个团体,他们就是朋友。因此,我必须为某个成员检索所有组的所有成员资格,然后从这些组中检索所有成员

ToList方法不适用于我的情况,因为每次我想以各种方式处理我的朋友时,都会执行查询,例如查找我们可以共享的内容。从数据库中检索所有成员,而不仅仅是处理查询并在最后一个可能的时间执行查询,将降低性能

尽管如此,我在这种情况下的第一次尝试就是这样做——检索我所属的所有组(IQueryable),初始化一个列表结果(IEnumerable),然后遍历所有组,如果它们不在列表中,则将所有成员追加到结果中。最后,由于我的接口强制返回IQueryable,因此我返回了带有AsIQueryable的列表

这是一段令人讨厌的代码,但至少它起作用了。它看起来像这样:

var result = new List<Member>();
foreach (var group in GetGroupsForMember(member))
    result.AddRange(group.GroupMembers.Where(x => x.MemberId != member.Id && !result.Contains(x.Member)).Select(groupMember => groupMember.Member));
return result.AsQueryable();
var groups = GetGroupsForMember(member);
var groupMembers = GetGroupMembersForGroups(groups);
var memberIds = groupMembers.Select(x => x.MemberId);
var members = memberService.GetMembers(memberIds);
这两个Get方法尊重IQueryable,从不将其转换为列表或任何其他IEnumerable。第三行只是在IEnumerable的顶部执行LINQ查询。最后一行仅获取成员ID并从另一个服务检索所有成员,该服务也专门用于IQueryables

就性能而言,这可能仍然很糟糕,但如果需要,我可以在以后进一步优化它。至少,我避免了加载不必要的数据


如果我在这里大错特错,请告诉我。

嗨,乔恩,谢谢你。真是太棒了!我以前从未想过要这样做过滤器。得心应手:)
var groups = GetGroupsForMember(member);
var groupMembers = GetGroupMembersForGroups(groups);
var memberIds = groupMembers.Select(x => x.MemberId);
var members = memberService.GetMembers(memberIds);