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

C# 如何在我的LINQ查询中包含第二个表中的列,c#,entity-framework,linq-to-sql,entity-framework-6,C#,Entity Framework,Linq To Sql,Entity Framework 6,我有一张名为Ad(广告)的表格: 我有一个名为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

我有一张名为
Ad
(广告)的表格:

我有一个名为
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();
}
我想在结果中包括一个标志,指示广告是否添加到收藏夹列表中?

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

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
相关行,如:

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();

谢谢,这会有用的。。。但是我需要去数据库两次,我想一次就得到所有东西。@hoomannbahreini你需要设置导航属性,谢谢。所以建议您将isFavorities标志添加到新类型?这对我来说很有意义。。。返回Ad(包括iFavorite)可能更容易,但同时,该标志并不真正属于Ad实体。@HoomanBahreini是的,我认为添加一个新类是有意义的,由于该表在物理上没有该列,因此它对于您的业务逻辑来说是合乎逻辑的。如果您只需要用户最喜爱的广告,那么导航属性很简单,只需在
最喜爱的
中添加
广告
,链接到
AdId
,我想显示该广告,而不管它是否最喜爱。如果它在收藏夹中,那么在它旁边放一个“心脏”图标。
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();
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
                      };
}