如何使用Linq或EF Join等方式实现C#MVC中的连接和位置?
这是我想要实现的等效SQL。
#some-id
此方法应返回用户的促销列表。首先,我获得所有促销的列表,然后我获得用户声明的促销的综合列表。这是我到目前为止所做的。
select * from promotion P
JOIN PromotionsClaimed PC
on PC.PromotionId = P.objectid
where PC.userId = @USERID
我意识到这里存在很多问题。我试图学习Linq和Entity Framework,但我不知道如何将where子句添加到IList,或者是否有更简单的方法来实现它。
在我看来,有一种方法可以过滤促销列表,其中包含 public IList<Promotion> GetRewardsForUser(string userId)
{
//a list of all available promotions
IList<Promotion> promos = _promotionLogic.Retrieve();
//contains a list of Promotion.objectIds for that user
IList<PromotionsClaimed> promosClaimed = _promotionsClaimedLogic.RetrieveByCriteria(t => t.userId == userId);
//should return a list of the Promotion name and code for the rewards claimed by user, but a complete list of Promotion entities would be fine
var selectedPromos =
from promo in promos
join promoClaimed in promosClaimed on promo.objectId equals promoClaimed.PromotionId
select new { PromoName = promo.Name, PromoCode = promo.Code };
return selectedPromos;
}
列表中的Promotion.objectId
,但我不知道语法。
答案 0 :(得分:1)
如果我理解你的问题,你可以这样做:
public IList<Promotion> GetRewardsForUser(string userId)
{
//contains a list of Promotion.objectIds for that user
IList<PromotionsClaimed> promosClaimed = _promotionsClaimedLogic
.RetrieveByCriteria(t => t.userId == userId);
var promotionIds = promosClaimed.Select(p => p.PromotionId).ToList();
IList<Promotion> promos = _promotionLogic.Retrieve()
.Where(p => promotionIds.Contains(p.objectId))
.Select(p => new { PromoName = p.Name, PromoCode = p.Code });
return selectedPromos;
}
声明的促销活动应该已经被用户过滤,因此应可能正常工作。
答案 1 :(得分:1)
首先,您是否正在使用实体框架?或者你只是想加入两个系列?
因为如果你使用的是EF,你会错误地思考。在实体中,正确的方法是使用include,例如:
public DbSet<promotion > promotion { get; set; }
public DbSet<PromotionsClaimed> PromotionsClaimed{ get; set; }
Context.promotion.Include(o => o.PromotionsClaimed).FirstOrDefault(s => s.Id == USERID);
如果你只需要使用linq加入两个集合,你可以这样做。
var userId = 1;
var test =
(
from p in promos
join pc in promosClaimed on p.objectid equals pc.PromotionId
where pc.userId == userId
select p
).ToList();
答案 2 :(得分:1)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sticky_notes_container">
<div class="sticky_note">
<div class="title">
<input type="text" name="title" placeholder="My Title"><span class="close">x</span>
</div>
<div class="content">
<textarea name="note" placeholder="Type here..."></textarea>
</div>
</div>
</div>
<button id=addBtn>Add</button>
答案 3 :(得分:0)
您是否尝试过将条件添加到代码中?像:
var selectedPromos =
from promo in promos
join promoClaimed in promosClaimed on promo.objectId equals promoClaimed.PromotionId
where promosClaimed.UserId == userId
select new { PromoName = promo.Name, PromoCode = promo.Code };
这应该有用,或者我只是不理解你