我试图获取标签为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条记录
答案 0 :(得分: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')