C# WebApi Odata - EF 不过滤

标签 c# entity-framework asp.net-web-api odata

大家好!

sql server返回后的ODATA过滤,我想过滤之前只返回我的记录。

我有一个包含 + 100 万条记录的表。

我需要中止 OData 使用吗? (我的天)...

我的系统开发已完成 60% 以上,并且全部使用 OData...(大约 300 小时...令人沮丧...)

这可能是一个错误,或者我在做一些疯狂的事情?

受影响的程序集

.NET 框架 4.5.2

Microsoft.Data.OData 5.6.0

系统.Web.Http.OData 5.3.1.0

Entity Framework 6.0.0.0

重现步骤

我有一个名为 Project 的实体,如下所示:

[Table("Project")]
public partial class Project
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Project()
    {
        Batches = new HashSet<Batch>();
    }

    [Key]
    public int IdProject { get; set; }

    public int IdCompany { get; set; }

    [StringLength(100)]
    public string Name { get; set; }

    public virtual Company Company { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Batch> Batches { get; set; }
}

我正在使用以下方法过滤此 ODATA:

http://localhost:36983/odata/Project ?$filter=IdProject+eq+1527&$select=IdProject,名称

我的 Controller :

public class ProjectsController : ODataController
{
    private IProtocolContext db = new IProtocolContext();

    public ProjectsController()
    {
        db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
    }

    // GET: odata/Projects
    [EnableQuery]
    public PageResult<Project> GetProjects()
    {
        var properties = Request.ODataProperties();
        return new PageResult<Project>(db.Project, properties.NextLink, properties.TotalCount);
    }

    //...
}

ODATA 响应:

{
  "odata.metadata":"http://localhost:36983/odata/$metadata#Projects&$select=IdProject,Name","odata.count":"1","value":[
    {
      "IdProject":1527,"Name":"Piloto - TSI 2006"
    }
  ]
}

预期结果

SELECT 
[Extent1].[IdProject] AS [IdProject], 
[Extent1].[Name] AS [Name]
FROM  [dbo].[Project] AS [Extent1]
WHERE IdProject = 1527

实际结果

我的调试从 Entity Framework 返回了这个 sql:

SELECT 
[Extent1].[IdProject] AS [IdProject], 
[Extent1].[IdCompany] AS [IdCompany], 
[Extent1].[Name] AS [Name]
FROM  [dbo].[Project] AS [Extent1]

其他详细信息

这导致我出现性能问题

最佳答案

我的看起来像这样。请注意 ODataQueryOptions 的使用。

[HttpGet, Route("getPagedData")]
public PageResult<MyEFClassToFilterOn> GetPagedData(ODataQueryOptions opts)
{
     using (var db = new dbEntities())
     {
        var myQueryable = _searchRepo.GetBatchQueryable(db);
        var myFilteredQueryable = opts.ApplyTo(myQueryable.AsQueryable()) as IQueryable<MyEFClassToFilterOn>;
        var result = myFilteredQueryable.ToList();
        var rowcount = result.Count();
        return new PageResult<MyEFClassToFilterOn>(emailBatch, null, rowcount);
     }
}

我原来的 url 看起来像这样: http://localhost:59637/api/mycontroller/getPagedData/ ?$inlinecount=allpages&$filter=(substringof(%27test%27,tolower(FirstName)))%20or%20(substringof(%27test%27,tolower(LastName)))&$skip=0&$top=10

希望对您有所帮助!

关于C# WebApi Odata - EF 不过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41902162/

相关文章:

c# - 从 xsd 架构中提取 XPath

c# - ASP.NET MVC 大型项目架构

c# - 为什么 DbMigration 类中的 Up() 方法是抽象方法,而 Down() 方法是虚拟方法

asp.net - 将 SQL Server Compact 与 ASP.NET Identity 结合使用

asp.net-mvc - ASP.NET MVC WebApi : No parameterless constructor defined for this object

c# - 如何将默认 Web API 2 更改为 JSON 格式化程序?

C# bool 比较与设置性能

c# - 使用 foreach 循环查找作为其他对象的子对象的游戏对象 (Unity3d)

c# - PhotoChooserTask 后未触发 ApplicationBar 图标按钮单击事件

asp.net-web-api - ASP.NET 身份承载 token 与 JWT 的优缺点