gpt4 book ai didi

c# - 具有 lambda 表达式的泛型

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:25 25 4
gpt4 key购买 nike

我正在尝试为使用 MongoDb 的非常具体的应用程序创建“某种”自定义“DbContext”。我遇到了一个问题:

DbSet 如何知道 DbContext 的存在?

我是说,当我写的时候

public DbSet<Assignment> Assignments { get; set; }
public DbSet<User> Users { get; set; }

在我的 DbContext 中,DbSet 实例如何获取对 DbContext 类的引用?通过反射?

但是当我深入研究 EntityFramework source code 时我遇到了另一个问题

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class => _setInitializer.Value.CreateSet<TEntity>(this);

在这个表达式中,我无法理解“where”子句中的 lambda 表达式是什么。有没有大佬解惑一下?

UPD
每次我在 DbContext 中调用我的 DbSet 属性时

public class BlogPostContextContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}

DbSet 调用 DbContext 并对数据进行必要的操作。我的问题是:DbSet 如何获取对 DbContext 的引用。我问的是 DbSet 和 DbContext 之间的底层通信。

提前致谢。请原谅我的英语。
伊万·塔拉拉耶夫

最佳答案

I cannot understand what does lambda expression in "where" clause.

方法声明有两部分。第一个是泛型​​类型约束:

where TEntity : class

这意味着在 TEntity 位置使用的任何类型都需要是 reference type .

第二部分是 Expression-bodied function :

=> _setInitializer.Value.CreateSet<TEntity>(this);

这是 C# 6.0 的一个特性。如果您的方法是单行代码,则可以 Lambda 表达式一样声明它。它只是意味着每次调用 Set 时,它都会调用该方法的一行“主体”。编译器会将其转换为“幕后”的命名方法。

How did DbSet know of DbContext existence?

直接不知道它。 DbContext 代表您的数据库,DbSet 代表该数据库中的表。当您操作您的 DbSet 时,它隐含地持有对其底层 DbContext 的引用并通过上下文添加它的实体。

关于c# - 具有 lambda 表达式的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30410083/

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