gpt4 book ai didi

c# - 如何在 Entity Framework Code First 中的子集合上创建表达式

转载 作者:行者123 更新时间:2023-12-02 17:40:59 25 4
gpt4 key购买 nike

我正在尝试将在许多地方使用的一段逻辑转换为可以在 SQL Server 上下文中重用、集中维护和执行的表达式。

当直接在 EF 上下文上查询表时,我可以通过向它们传递一个表达式来执行此操作。我遇到的问题是尝试对表的子集合执行此操作,因为它们在 EF Code First 中表示为 ICollection。

Code First 中定义的简单示例表;

public class Table
{
public int TableId { get; set; }
public virtual ICollection<ChildTable> Children { get; set; }
}

我如何查询以及我想如何查询;

var records = context
.Table
.Select(table => new
{
ChildRecordCount = table.Children.Count(child => !child.IsArchived), // This works.
AltChildRecordCount = table.Children.Count(HowToExpressThisInCSharp()),// Cannot fathom how to do this.
});

我尝试了各种返回 Func 的方法(见下文),但它们会导致 EF 失败,正如我所期望的那样(SQL 对我的 C# 方法一无所知)。那么,如何将更简单的内联方法转换为表达式树(我可以看到它是针对 SQL Server 执行的)?

    static Func<Menu, bool> HowToExpressThisInCSharp()
{
return x => !x.IsArchived;
}

最佳答案

使用Queryable.AsQueryable扩展方法。它完全适合您的用例。

static Expression<Func<Menu, bool>> HowToExpressThisInCSharp()
{
return x => !x.IsArchived;
}

var records = context
.Table
.Select(table => new
{
ChildRecordCount = table.Children.Count(child => !child.IsArchived), // This works.
AltChildRecordCount = table.Children.AsQueryable().Count(HowToExpressThisInCSharp()), // this works too :)
});

关于c# - 如何在 Entity Framework Code First 中的子集合上创建表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37419538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com