Получение сопоставленных строк из IQueryable <ForeignKey>в Linq2Sql - PullRequest
0 голосов
/ 04 января 2010

Ситуация такова: на веб-странице отображается список собраний зарегистрированного пользователя. Среди этой группы запросов могут быть собрания, на которые пользователь подписан, но еще не просматривал до загрузки этой страницы. Теперь, когда собрания были просмотрены этим пользователем, я хочу отметить их как таковые.

Я могу заставить это работать, используя ToList () и Contains () (см. Ниже), но это означает, что мне нужно совершить 2 поездки в базу данных: 1 для ToList () и 1 для foreach (). Я пробовал другие способы получить эти подписки, но вместо этого они стали EntitySet.

Users     Gatherings
=====     ==========
UserId    GatheringId

GatheringSubscriptions
======================
GatheringSubscriptionId
GatheringId
UserId
IsViewed

// update unviewed=>viewed for this user's subscription to each
// of these gatherings
public void MarkViewed(IQueryable<Gathering> gatherings, int userId) {
    List<int> gIdsList = gatherings.Select(g => g.GatheringId).ToList();
    IQueryable<GatheringSubscription> gSubs = db.GatheringSubscriptions
        .Where(gs =>
            gs.UserId == userId &&
            !gs.IsViewed &&
            gIdsList.Contains(gs.GatheringId))
        .Distinct();
    foreach (GatheringSubscription gSub in gSubs)
        gSub.IsViewed = true;
    db.SubmitChanges();
}

Как я могу добиться того же, но только за 1 поездку в базу данных?

1 Ответ

0 голосов
/ 04 января 2010

Та же проблема, что и здесь: linq вопрос: запрос вложенных коллекций

Решение состоит в том, чтобы изменить это:

db.GatheringSubscriptions
    .Where(gs =>
        gs.UserId == userId &&
        !gs.IsViewed &&
        gIdsList.Contains(gs.GatheringId))
    .Distinct();

к этому:

tickers.SelectMany(t => t.GatheringSubscriptions)
    .Where(gs =>
        gs.UserId == userId &&
        !gs.IsViewed)
    .Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...