我想知道是否可以访问和使用.FirstOrDefaultAsync的属性. 我的try 如下:

如果可能,我需要在代码中更改什么? 提前谢谢您.

    public class BaseRepository<T> : IBaseRepository<T> where T : class
    {
        private readonly ODWEApiDbContext _DbContext;

        public BaseRepository(ODWEApiDbContext dbContext)
        {
            _DbContext = dbContext;
        }

        public virtual async Task<T> GetByPersonalId(int entityId)
        {
            return await _DbContext.Set<T>().OfType<T>().FirstOrDefaultAsync(x => x.PersonalId == entityId);
        }
    }

推荐答案

根据您提供的唯一必要代码:

where T : class

// and

_DbContext.Set<T>().FirstOrDefaultAsync(x => x.PersonalId == entityId);

//.OfType<T>() is not necessary

如果我们把它写得更明确,它将是:

_DbContext.Set<T>().FirstOrDefaultAsync((object x) => x.PersonalId == entityId);

因为classdefaultobject,而object没有名为PersonalId的属性.

因此,您需要更新T的约束,以包括具有该属性的接口或具有该属性的类:

// abstract not required, just recommended
public abstract class EntityBase
{
  public int PersonalId { get; set; }
}

where T : EntityBase


// or


public interface class IEntityBase
{
  int PersonalId { get; }
}

where T : IEntityBase, class

然后,您必须确保您想要使用的任何T都必须派生自您 Select 的T:

public class Person : EntityBase
{
  // ...
}

public class Person : IEntityBase 
{
 // ...
}

所以我们最终会有

public class BaseRepository<T> : IBaseRepository<T> where T : IEntityBase, class
{
  // ...

  public virtual async Task<T> GetByPersonalId(int entityId)
  {
    return await _DbContext
      .Set<T>()
      .FirstOrDefaultAsync(x => x.PersonalId == entityId);
  }
}

哪里

(x => x.PersonalId == entityId)

// would written more explicitly would be

((IEntityBase x) => x.PersonalId = entityId)

使用派生类型时:

public class PersonRepository : BaseRepository<Person> 
where T : IEntityBase, class
{
}

谓词(x => bool)只能使用IEntityBase的属性,Set<T>()返回的DBSet将是实例化存储库中的派生类型:

using (var personRepo = new PersonRepository(db))
{
  Person person = personRepo.GetByPersonalId(1);
  // or
  var person = personRepo.GetByPersonalId(1);
}

Csharp相关问答推荐

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

.NET框架4.7.2项目如何引用.NET Core 2.2库?

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

Blazor Foreach仅渲染最后一种 colored颜色

为什么我的表单在绑定到对象时提交空值?

如何在C#中实现非抛出`MinBy`?

我什么时候应该在Dapper中使用Connection.OpenAsync?

在C#中有没有办法减少大型数组中新字符串的分配?

JsonPath在Newtonsoft.Json';S实现中的赋值

当我try 在与XAMP的MySQL服务器连接的ASP.NET核心应用程序中添加迁移时出现错误

.NET8Blazor-为什么Rapzor渲染在for循环之后显示?

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

C#无法将.csv列转换为用于JSON转换的列表

当我手动停止和关闭系统并打开时,Windows服务未启动

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

使用本地公共PEM文件加密字符串,使用Azure KayVault中的私钥解密

将两个JSON文件与覆盖值的主文件合并

更新实体框架上的被跟踪实体

C#如何替换两个XML元素值?