2014-12-10 3 views
0

Я здание моего первого приложения с C# и sp.net MVC 5, до сих пор так хорошо :)asp.net MVC Где в Список

Теперь у меня есть проблема, мы используем 2 пользовательских таблиц, первая одна содержит имя пользователя, другие данные пользователя.

string user = User.Identity.Name; 

     var data = db.FE_Benutzer; 
     var collection = data.Where(o => o.Benutzername == user).Select(x => new 
     { 
      id = x.ID, 
      name = x.Name, 
      hauptbereiche = x.Hauptbereich.ToList() 
     }); 


     var dataHauptbereich = db.Hauptbereich; 

     var collectionHauptbereich = dataHauptbereich.Where(o => collection.ElementAt(0).hauptbereiche.Contains(o)).Select(x => new 
     { 
      id = x.ID, 
      name = x.Name 
     }); 

     return Json(collectionHauptbereich, JsonRequestBehavior.AllowGet); 

Я получаю эту ошибку

LINQ к Entities не распознает метод '<> f__AnonymousType6 3[System.Int32,System.String,System.Collections.Generic.List 1 [scorring.Models.Hauptbereich]] ElementAt [<> f__AnonymousType6 3](System.Linq.IQueryable 1 [<> f__AnonymousType6 3[System.Int32,System.String,System.Collections.Generic.List 1 [scorring.Models.Hauptbereich]]], Int32) ', и этот метод не может быть переведен в выражение хранилища.

hauptbereiche = x.Hauptbereich.ToList()

содержит список идентификаторов, где пользователь имеет premission к.

Когда я выборки данных

dataHauptbereich.Where

Я не буду включать только идентификаторы у меня есть в списке

как это возможно?

+0

'Где (о => somelist.Contains (о))' – Casey

+0

@emodendroket Я обновил мой вопрос, новый У меня есть ошибка ... –

ответ

1

Попробуйте

dataHauptbereich.Where(o => collection.ElementAt(0).hauptbereiche.Any(h => h.ID == o.ID)) 

Или

dataHauptbereich.Where(o => collection.Any(c => c.hauptbereiche.Any(h => h.ID == o.ID))) 
+0

Stil та же ошибка LINQ для лиц не признает метод '<> f__AnonymousType6'3 [System.Int32, System.String, System.Collections.Generic.List'1 [scorring.Models.Hauptbereich]] ElementAt [<> f__AnonymousType6'3] (System.Linq.IQueryable'1 [ <> f__AnonymousType6'3 [System.Int32, System.String, System.Collections.Generic.List'1 [scorring.Models.Hauptbereich]]], Int32), и этот метод не может быть переведен в выражение хранилища. –

0

У меня есть немного времени, которое расшифровывает именно то, что вы пытаетесь достичь с помощью своего кода здесь, но мне кажется, что вы просто запрашиваете Hauptbereich s, которые принадлежат к конкретный пользователь. Ваш первый запрос выбирает анонимный объект, состоящий из id, name и hauptbereiche, но из них вы всегда используете только свойство hauptbereiche. Затем во втором запросе вы просто выбираете Hauptbereich s, которые соответствуют элементу в этой коллекции hauptbereiche. Фактически, здесь вы сравниваете только значения из первого элемента в исходной коллекции, в котором возникает вопрос, почему вы выбираете что-либо, кроме первого элемента. Это, и этот второй запрос полностью избыточен, потому что если элементы совпадают, это означает, что у вас уже есть предметы в первую очередь. Вы можете получить одну и ту же информацию напрямую от collection.ElementAt(0).hauptbereiche без выдачи второго запроса.

Итак, вот несколько простых вариантов:

  1. Если вы пытаетесь получить все Hauptbereich S, которые принадлежат всем FE_Benutzer с, где Benutzername == user то просто сделать:

    var collectionHauptbereich = db.FE_Benutzer.Where(m => m.Benutzername == user) 
        .Include(m => m.Hauptbereich) 
        .SelectMany(m => m.Hauptbereich); 
    
  2. Если вы хотите только первый FE_Benutzer элемента Hauptbereich с, а затем сделать:

    var benutzer = db.FE_Benutzer.Where(m => m.Benutzername == user) 
        .Include(m => m.Hauptbereich) 
        .FirstOrDefault(); 
    var collectionHauptbereich = benutzer != null 
        ? benutzer.Hauptbereich.ToList() 
        : new List<Hauptbereich>();