首页 > 解决方案 > 当使用 OwnsOne()

问题描述

我有几个用于搜索数据库的存储过程。每个返回几个字段与找到/返回的数据量有关。模型如下所示:

// simplified
public abstract class SearchResult {
  public int RowCount { get; set; }
  public int FilteredRowCount { get; set; }
  // other properties
}

public class FooSearch {
  public string Id { get; set; }
  public string Foo { get; set; }
  public SearchResult Result { get; set; }
}

然后在我OwnsOne()用来链接类的 DBContext 中,按照这个 MS 指南

public DbSet<FooSearch> FooSearch { get; set; }

// OnModelCreating
builder.Entity<FooSearch>().OwnsOne(t => t.Result);

最后我打了 SP 电话:

var searchResult = db.FooSearch.FromSqlRaw("EXECUTE [Search].[Foo] {0}, {1}", foo, bar).ToList();

然而,这最后一步给了我以下错误:

System.InvalidOperationException: 'FromSqlRaw 或 FromSqlInterpolated 是用不可组合的 SQL 调用的,并且有一个查询在它上面编写。考虑AsEnumerable在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用以在客户端执行组合。

更改ToList()AsEnumerable()对结果没有影响。

如果我从类中删除OwnsOne()andResult属性,FooSearch那么 SP 工作并且我得到结果。这个问题的原因是什么,我该如何解决?

标签: c#entity-framework-core

解决方案


在阅读问题#18232后,我遇到了同样的问题并修复了它。

您需要.IgnoreQueryFilters()FromSqlRaw. 像那样:

var searchResult = db.FooSearch
.FromSqlRaw("EXECUTE [Search].[Foo] {0}, {1}", foo, bar)
.IgnoreQueryFilters()
.ToList();

推荐阅读