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
};
}