2013-06-18 3 views
0

im пытается получить статьи, которые представлены в виде publid (DisplayFor = false) или с требуемым разрешением (DisplayFor = true, а в группах статей содержатся предоставленные группы;) и (GroupID = Guid.Empty для каждого зарегистрированного пользователя):запрос linq Невозможно создать постоянную коллекцию значений в коллекции

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 поэтому я Wouldnt нужно выбрать 1000s записей для того, чтобы получить 10 записей из него

+0

Это ** ** ничего сделать с помощью LINQ запрос ... –

+0

, тогда вы можете просветить меня, что мне делать? –

+0

Дважды щелкните по ошибке. –

ответ

0

Попробуйте это. Это приведет к удалению списка групп из запроса LINQ, но если ваш groupId является 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; 

Когда раздел запроса включен в запрос. EF пытался преобразовать Enumerable в SQL Query, и это просто невозможно. Извлекая и заставляя ToList() (The ToList является важной частью), вы вынуждаете EF, чтобы преобразовать список в запрос SQL, который будет выглядеть как

WHERE g.GroupId IN ('guid1', 'guid2', ... 'guidN') 
+0

спасибо, что вы спасли мой день; я попытался отметить как ответ, но он говорит, что он должен ждать !!!!!!!! каким-либо образом вы можете сказать мне, почему эта линия должна выйти наружу? –

+0

Когда вы имеете дело с LINQ для сущностей, вы не можете отправлять не примитивные значения в запрос. Извлекая группы, в основном ef преобразует groupIds в WHERE g.GroupdId IN ('guid1', 'guid2', ..., 'guidN') –

+0

thanks man; очень ценю это :) хорошо провести день –