как включить столбец из второй таблицы в мой запрос LINQ - PullRequest
0 голосов
/ 13 января 2019

У меня есть таблица с именем Ad (реклама):

public class Ad
{
    public long AdId { get; set; }
    public long UserId { get; set; } // <-- this is advertiser not currentUser
    public string Description { get; set; }
}

Пользователи могут добавить ноль или более объявлений в свой список избранного, поэтому я создал еще одну таблицу с именем Favourite:

public class Favourite
{
    public long FavouriteId { get; set; }
    public long AdId { get; set; }
    public long UserId { get; set; }
}

И у меня есть таблица с именем User:

public class User
{
    public long UserId { get; set; }
    public string Name { get; set; }
}

Вот так я получаю объявление, учитывая currentUserId и adId:

public TEntity GetAd(long currentUser, long adId)
{
    return Context.Ad
        .Where(r.AdId == adId)
        // include a flag indicating the pair (adId and currentUserId) exist in Favouries table
        .FirstOrDefault();
}

Я хочу включить в результат флаг, указывающий, добавлено ли объявление в список избранного или нет?

Ответы [ 2 ]

0 голосов
/ 13 января 2019
public object GetAd(long currentUser, long adId)
{
    return from a in Context.Favourite
           where a.UserId  == currentUser
           select new {
                      flag = a.AdId != null
                      a.FavouriteId,
                      //etc
                      };
}
0 голосов
/ 13 января 2019

В Entity Framework у нас есть свойства навигации. Вы можете определить свойство навигации в дочерней таблице для строки родительской таблицы. В вашем случае вы можете изменить свою дочернюю сущность следующим образом:

public class Favourite
{
    public long FavouriteId { get; set; }
    public long AdId { get; set; }
    public long UserId { get; set; }

    public virtual Ad Ad { get; set; }
}

и теперь Entity Framework должен позаботиться о его заполнении для вас, и вы можете получить доступ к Ad связанной строке Favourite, например:

return Context.Ad
        .Where(r => r.UserId == userId && r.AdId == adId)
        .Select(x => x.Ad.Description);

Но в вашем случае вы можете написать запрос, чтобы узнать, является ли объявление любимым или нет:

return Context.Ad
        .Where(r.AdId == adId)
        Select(x => new 
                   { 
                      ad = x, 
                      IsFavourite = Context.Favourite.Any(y=> y.AdId = adId 
                                                    && y.UserId = currentUserid))
        .FirstOrDefault();

Вы можете создать модель представления домена и сопоставить ее с этим:

public UserFavouriteAd
{
    public Ad Ad { get; set; }
    public IsFavourite { get; set; }
}

и заполните его:

return Context.Ad
            .Where(r.AdId == adId)
            .ToList()
            Select(x => new UserFavouriteAd 
                       { 
                          ad = x, 
                          IsFavourite = Context.Favourite.Any(y=> y.AdId = adId 
                                                        && y.UserId = currentUserid))
            .FirstOrDefault();
...