0

我试图获取标记为 publid (DisplayFor = false) 或具有所需权限的文章 (DisplayFor = true; 并且 article.groups 包含授予的组;) 和 (GroupId = Guid.Empty 对于每个注册用户):

List<Group> groups = new UserBiz().Groups(AchaAuth.CurrentUserId);
var result = from HeadsupArticle article in ctx.HeadsupArticles
                             where article.GroupId == item.GroupId &&
                                   article.Active &&
                                   (!article.DisplayFor || (article.DisplayFor && article.Groups.Any(g =>
                                    g.GroupId == Guid.Empty ||
                                    groups.Select(i => i.GroupId).Contains(g.GroupId)
                                   )))
                             select article;

问题是

Unable to create a constant value of type 'Achasoft.AchaCms.Models.Group'. Only primitive types or enumeration types are supported in this context.

我需要一个适当的 linq 查询,所以我不需要选择 1000 条记录来从中获取 10 条记录

4

1 回答 1

0

尝试这个。这将从 LINQ 查询中删除组列表,但如果您的 groupId 是一个 Guid 并且用户可以拥有多个组,您将向查询发送一个非常大的 guid 列表。

List<Group> groups = new UserBiz().Groups(AchaAuth.CurrentUserId);
var groupsIds = groups.Select(i => i.GroupId).ToList();
var result = from HeadsupArticle article in ctx.HeadsupArticles
                             where article.GroupId == item.GroupId &&
                                   article.Active &&
                                   (!article.DisplayFor || (article.DisplayFor && article.Groups.Any(g =>
                                    g.GroupId == Guid.Empty ||
                                    groupsIds.Contains(g.GroupId)
                                   )))
                             select article;

当 groupIds 部分包含在查询中时。EF 试图将 Enumerable 转换为 SQL Query,这是不可能的。通过提取和强制 ToList() (ToList 是重要部分),您正在强制 EF 将列表转换为看起来像的 SQL 查询

 WHERE g.GroupId IN ('guid1', 'guid2', ... 'guidN')
于 2013-06-18T19:54:36.453 回答