簡體   English   中英

Linq 和 Lambda - 如何限制連接的表行?

[英]Linq with Lambda - how do I restrict joined table rows?

我想使用 Linq 在運動隊數據庫上復制此 T-SQL 查詢,以查找手球隊中有經驗的球員:

Select TE.TeamName, PL.FirstName, PL.LastName 
From T_Team as TE 
Inner Join T_Player As PL 
On PL.Team_ID = TE.Team_ID 
And PL.ExpLevel = 'Experienced' 
Where TE.SportName = 'Handball'

我嘗試為我的兩個表創建兩個實體:

public class TTeam 
{
    public int TeamId { get; set; }
    public string TeamName { get; set; }
    public string SportName { get; set; }

    public virtual List<TPlayer> TeamPlayers { get; set; }

    // Called in the context OnModelCreating() method
    public static void CreateModel(EntityTypeBuilder<TTeam> p_ebpTable)
    {
        p_etbTable.ToTable("T_TEAM");

        p_etbTable.HasKey(t => new { t.TeamId }).HasName("PK_TEAMID_T_TEAM");

        // Column definitions

        // Foreign Keys
        p_etbTable.HasMany(t => t.TeamPlayers).
                   WithOne(p => p.CurrentTeam).
                   HasPrincipalKey(t => t.TeamId).
                   HasForeignKey(p => p.TeamId);
    }
}

public class TPlayer
{
    public int PlayerId { get; set; }
    public int TeamId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string ExpLevel { get; set; }

    public virtual TTeam CurrentTeam { get; set; }

    // Called in the context OnModelCreating() method
    public static void CreateModel(EntityTypeBuilder<TPlayer> p_ebpTable)
    {
        p_etbTable.ToTable("T_PLAYER");

        p_etbTable.HasKey(t => new { t.PlayerId }).HasName("PK_PLAYERID_T_PLAYER");

        // Column definitions

        // Foreign Keys
        p_etbTable.HasOne(p => p.CurrentTeam).
                   WithMany(t => t.TeamPlayers).
                   HasForeignKey(p => p.TeamId).
                   HasPrincipalKey(t => t.TeamId);
    }
}

然后使用它們

using Microsoft.EntityFrameworkCore;

IEnumerable<TTeam> z_enbHandballTeams = z_dbcDbContext.TTeamRepository
    .Where(te => te.SportName == "Handball")
    .Include(te => te.TeamPlayers.Where(pl => pl.ExpLevel == "Experienced"));

但是在foreach中循環z_enbHandballTeams會拋出InvalidOperationException並顯示消息“Include 中使用的 Lambda 表達式無效”。

(我想不用說ExpLevel是一個數字,而SportName實際上是SportId ,但我覺得這樣看起來更容易閱讀。)

我究竟做錯了什么?

EF Core 3.1.x 不支持過濾的Include 解決方法是通過Select做到這一點

var z_enbHandballTeams = z_dbcDbContext.TTeamRepository
    .Where(te => te.SportName == "Handball")
    .Select(te => new TTeam
    {
        TeamId = te.TeamId,
        TeamName = te.TeamName,
        SportName = te.SportName,

        TeamPlayers = te.TeamPlayers.Where(pl => pl.ExpLevel == "Experienced")
            .ToList()
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM