EF Lambda Как сделать проекцию для GroupJoin

#entity-framework #linq #lambda

#entity-framework #linq #лямбда

Вопрос:

Я пытаюсь запросить модели EF. (GameBank и GameCouponBank) Как я могу сделать проекцию для левого внешнего соединения (GoupJoin)?

Могу ли я сделать проекцию для купонов?

Вот мой запрос

 var gameBankResult = context.GameBanks.GroupJoin(context.GameCouponBanks, g => g.GameBankID, gc => gc.GameBankID,
                (g,gc) => new {
                    g.quantity,
                    g.currency,
                    g.initiationResultCode,
                    g.productCode,
                    g.productDescription,
                    g.referenceId,
                    g.responseDateTime,
                    g.unitPrice,
                    g.totalPrice,
                    Coupons = gc

                 })
                .Where(g => g.productCode == initiate.productCode)
                .Select(s => s);
 

Вот модели:

 public class GameBank
{
    public int GameBankID { get; set; }
    public string referenceId { get; set; }
    public string productCode { get; set; }
    public int quantity { get; set; }
    public string version { get; set; }
    public DateTime? requestDateTime { get; set; } = DateTime.Now;
    public int? customerID { get; set; }
    public string password { get; set; }
    public DateTime? responseDateTime { get; set; } = DateTime.Now;
    public string initiationResultCode { get; set; }
    public string companyToken { get; set; }
    public int used { get; set; }
    public string productDescription { get; set; }
    public string currency { get; set; }
    public double unitPrice { get; set; }
    public double totalPrice { get; set; }
    public virtual List<GameCouponBank> coupons { get; set; }
}

public class GameCouponBank
{
    public int Id { get; set; }
    public int GameBankID { get; set; }
    public DateTime? expiryDate { get; set; }
    public string Serial { get; set; }
    public string Pin { get; set; }

}
 

Ответ №1:

Вам не нужно использовать GroupJoin явно. Вы можете просто спроецировать свой запрос следующим образом:

 var gameBankResult = context.GameBanks.Where(g => g.productCode == initiate.productCode)
                 .Select(g => new {
                    g.quantity,
                    g.currency,
                    g.initiationResultCode,
                    g.productCode,
                    g.productDescription,
                    g.referenceId,
                    g.responseDateTime,
                    g.unitPrice,
                    g.totalPrice,
                    Coupons = g.coupons.Select(c => new {c.Id, c.GameBankID,...}).ToList() //<-- Here is the projection for coupons
                 }).FirstOrDefault(); // I assume you are returning single entity, if not then use `.ToList()` instead of `.FirstOrDefault()`