代码之家  ›  专栏  ›  技术社区  ›  Hooman Bahreini

如何在我的LINQ查询中包含第二个表中的列

  •  1
  • Hooman Bahreini  · 技术社区  · 7 年前

    我有张叫的桌子 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 回复  |  直到 7 年前
        1
  •  2
  •   Ehsan Sajjad    7 年前

    在实体框架中,我们有导航属性。可以为父表行在子表上定义导航属性。在这种情况下,您可以更改子实体,如下所示:

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

    现在,实体框架应该为您填充它,您可以访问 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();
    
        2
  •  0
  •   CodeMan    7 年前
    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
                          };
    }