2016-01-05 2 views
-1

Это мой метод действий, который извлекает всех пользователей с их идентификатором.Как добавить условие к запросу LINQ на основе Id

public JsonResult GetUsers() 
{ 
    var ret = (from user in db.Users.ToList() 
       select new 
       { 
       UserName = user.UserName, 
// i am stuck here, i want to get all those ids whom current logged user is following 
       Idfollowing = user.FollowTables.Contains() 
       Idnotfollowing = 
       }); 
     return Json(ret, JsonRequestBehavior.AllowGet); 
    } 

структура FollowTable такова:

ID UserId FollowId 
1 4  11 
2 4  12 
2 4  13 

здесь, идентификатор текущего пользователя LoggedIn является 4, и он следит за 11, 12, 13, так что я хочу вернуться только 11, 12 и 13 в Idfollowing и оставить оставшийся id в Idnotfollowing. как это сделать.

Ну, я думаю, что со списком или массивом я не получу желаемого результата. поэтому, я хочу добавить что-то здесь. Ну, с каждым UserName идентификатор также передается на страницу просмотра. Итак, я разделил их на два. Теперь, как назначать значения этим идентификаторам.

Comapre User.Id с матчем followId column.If текущего пользователя LoggedIn следует таблицы найден .i.e, если ид спички или нашел назначит user.id в Idfollowing и нуль в Idnotfollowing и наоборот в противоположном случае. Я должен сгенерировать следующую кнопку для изменения списка на основе этих возвращенных идентификаторов.

public JsonResult GetUsers() 
    { 
     int currentUserId = this.User.Identity.GetUserId<int>(); 
     var ret = (from user in db.Users.ToList() 
        let Id = user.FollowTables.Where(x => x.UserId == currentUserId).Select(f => f.FollowId).ToList() 
        let Idnot = (from user2 in db.Users 
           where !Id.Contains(user2.Id) 
           select user2.Id).ToList() 
        select new 
        { 
         UserName = user.UserName, 
         Id = Id, 
         //Id = user.FollowTables.Where(x => x.UserId == currentUserId) 
         //  .Select(x => x.FollowId).Single(), 
         Idnot = Idnot, 
+0

'Idnotfollowing =! Idfollowing', правильно? –

+0

yupp, он должен вернуть оставшиеся все ids @ kienct89 – duke

ответ

0
var ret = (from user in db.Users.ToList() 
       select new 
       { 
       UserName = user.UserName, 
       Idfollowing = user.FollowTables.Select(x=> x.Id) 
       Idnotfollowing = db.FollowTables.Where(x=> !user.FollowTables.Select(x=> x.Id).Contains(x.Id)).Select(x=> x.Id) 
      }); 

это некрасиво, но будет работать, должно быть еще лучше сделать.

+0

thnks попробует это тоже – duke

0

Вы можете просто использовать метод Where для фильтрации таблицы и использовать Select проект FollowiId: -

var ret = (from user in db.Users.ToList() 
      select new 
      { 
       UserName = user.UserName, 
       Idfollowing = user.FollowTables.Where(x => x.UserId == user.Id) 
            .Select(x => x.FollowId).ToArray(), 
       Idnotfollowing = user.FollowTables.Where(x => x.UserId != user.Id) 
            .Select(x => x.FollowId).ToArray() 
      }); 

Предполагая, Idfollowing & Idnotfollowing является массивом, если целых числа (если FollowId это целое число) в противном случае вы можете заменить его с ToList, если это список.

+0

его целое число, и мне нужно будет возвратить список из другого списка наверху – duke

+0

@duke - Дюк не достал вас. 'Idfollowing' будет иметь несколько идентификаторов? Таким образом, вам нужно сохранить это в списке или массиве. –

+0

не работает должным образом, возвращенные данные [{"UserName": "sachin", "Idfollowing": [], "Idnotfollowing": []}, {"UserName": "dravid", "Idfollowing": [], «Idnotfollowing»: [8]}, {«UserName»: «dhoni», «Idfollowing»: [], «Idnotfollowing»: []}], здесь текущий вход в систему - sachin, а его userId - 7, и он следит только 8-й userId, и я получаю тот же результат .ToList и ToArray @Rahul Singh – duke

1

Похоже, у вас есть стандартное отношение «один ко многим» от User до FollowTable. Эта модель данных предусматривает, что user.FollowTablesтолько содержит подписчиков. Вы не сможете заполнить Idnotfollowing от объекта FollowTables.

Нечто подобное может работать:

var query = (
    from user in db.Users // note: removed ToList() here 
          // to avoid premature query materialization 
    where //TODO ADD WHERE CLAUSE HERE ? 
    let followIds = user.FollowTables.Select(f => f.FollowId) 
    let notFollowIds = (from user2 in db.Users 
         where !followIds.Contains(user2.Id) 
         select user2.Id) 
    select new 
    { 
     UserName = user.UserName, 
     Idfollowing = followIds.ToArray(), 
     Idnotfollowing = notFollowIds.ToArray() 
    }) 
    // TODO add paging? .Skip(offset).Take(pageSize) 
    .ToList(); 

ли проверить SQL, генерируемый этим запросом и убедитесь, что он выполняет хорошо, хотя ...

Кроме того, обратите внимание, что я удалил .ToList() от db.Users.ToList() к избегайте преждевременной материализации запросов. Как правило, это плохая идея, чтобы извлечь все данные из таблицы без ограничений, вы, как правило, хотите получить

+0

Ну, я попробовал, он возвращает это json [{"UserName": "sachin", "Idfollowing": [], "Idnotfollowing": [8,9,7]}, {"UserName": "dravid" , «Idfollowing»: [8], «Idnotfollowing»: [7,9]}, {«UserName»: «dhoni», «Idfollowing»: [], «Idnotfollowing»: [8,9,7]}] здесь текущий зарегистрированный пользователь sachin, и его userId равен 7, и он следит только за 8-м пользователем. Любая идея, на самом деле я должен генерировать следующие кнопки unfollow на странице просмотра на основе этих идентификаторов, должен ли я показывать страницу просмотра, если это необходимо. @jeroenh – duke

+0

см. мое редактирование : удалить ToList() из db.Users.ToList(). Кроме того, рассмотрите возможность добавления предложения where и/или подкачки, чтобы избежать сбора всех данных из всей таблицы в памяти. – jeroenh

+0

Также сосредоточьтесь на проблеме. Речь идет о * извлечении данных из базы данных *, а не о том, как визуализировать эти данные в html *. Если у вас есть проблемы с последними, задайте отдельный вопрос. – jeroenh

Смежные вопросы