通用控制器中的LINQ to Entity Framework查询

本文关键字:to Entity Framework 查询 LINQ 控制器 | 更新日期: 2023-09-27 18:27:34

我正试图为Web Api编写一个通用控制器,但我遇到了一个问题,LINQ to EF不喜欢我所做的。

这是我试过的。

这是默认的控制器:

public class DefaultController<TEntity> : ApiController where TEntity : class, IEntity
{
    private AppEntities Context;
    private DbSet<TEntity> AppDbSet;
    public DefaultController()
    {
        Context = new AppEntities();
        AppDbSet = Context.Set<TEntity>();
    }
    public IHttpActionResult Get(int Id)
    {
        var entity = AppDbSet.Where(x => x.IdValue == Id);
        if (entity == null)
            return NotFound();
        return Ok(entity);   
    }
}

所以我决定创建一个接口:

public interface IEntity
{
    int IdValue { get; }
}

数据库优先的方法为每个表生成一个.cs文件,我在一个单独的文件中添加了一些内容:

public partial class User : IEntity
{
    public int IdValue
    {
        get
        {
            return this.Id;
        }
    }
}

这似乎在编译方面有效,但在运行时失败。

The specified type member 'IdValue' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

因此,我试图弄清楚如何在通用控制器中的LINQ查询中引用上下文实体的属性,但这失败了。

有什么想法吗?

附言:我知道通用控制器可能会有问题,但我想学习如何制作一个,以方便简单的模型使用。

通用控制器中的LINQ to Entity Framework查询

如果您想要Id为的基本接口,您应该将具有此属性的所有实体映射到数据库中的列。不应该有像这样的代理属性

    public int IdValue
    {
        get
        {
            return this.Id;
        }
    }

所以你应该创建界面

public interface IEntity
{
    int Id{ get; }
}

所有继承的实体都应该有这个属性

public partial class User : IEntity
{
    public int Id{get; set;}
}