如何使用Join和Where返回IList?

时间:2015-06-21 17:57:09

标签: c# linq entity-framework

如何使用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,但我不知道语法。

4 个答案:

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

这应该有用,或者我只是不理解你