EF Core 6 – ToQueryString() 在使用 FromSqlRaw 创建的查询上抛出异常 "Sequence contains no elements"
EF Core 6 – ToQueryString() on a query created with FromSqlRaw thows exception "Sequence contains no elements"
第一次使用EF Core的查询方式。因为我的带参数的大型查询也引发了异常“序列不包含任何元素”。
System.InvalidOperationException
HResult=0x80131509
Message=Sequence contains no elements
Source=System.Linq
StackTrace:
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.Max(IEnumerable`1 source)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.ShaperProcessingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
at System.Linq.Expressions.BlockExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.ShaperProcessingExpressionVisitor.VisitExtension(Expression extensionExpression)
at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.ShaperProcessingExpressionVisitor.ProcessShaper(Expression shaperExpression, RelationalCommandCache& relationalCommandCache, LambdaExpression& relatedDataLoaders, Int32& collectionId)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.VisitShapedQuery(ShapedQueryExpression shapedQueryExpression)
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.VisitExtension(Expression extensionExpression)
at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToQueryString(IQueryable source)
at Elwis.Orders.Persistence.GroupQueries.GetGroups(AccountId accountId, SalesGroupId salesGroupId, GroupStatus groupStatus, GroupAccountRole groupAccountRole, PermissionLevel permissionLevel, String sortingColumn, SortingDirection sortingDirection, Int32 pageSize, Int32 pageNumber) in C:\Users\micro\source\repos\rtsforder\Elwis.Orders.Persistence\Read\Queries\GroupQueries.cs:line 50
This exception was originally thrown at this call stack:
[External Code]
Elwis.Orders.Persistence.GroupQueries.GetGroups(Elwis.SharedKernel.Domain.AccountId, Elwis.Orders.Domain.SalesGroupId, Elwis.Orders.Domain.GroupStatus, Elwis.Orders.Domain.GroupAccountRole, Elwis.SharedKernel.Domain.PermissionLevel, string, Elwis.SharedKernel.Domain.Enums.SortingDirection, int, int) in GroupQueries.cs
我简化了 sql 代码以定位错误并从联接表返回常量值。我用ToQueryString()
将生成的SQL输出到控制台。
var query = _dbContext.Set<GetGroupDTO>().FromSqlRaw(@"
Select GroupId, SalesGroupName='RTSF', Name, Owner, Status='OPEN',
[Start], [End], AccountRole='Owner', Suspended,
Created, LastUpdated, ChangedBy, _eTag
FROM OD.[Group]");
Console.WriteLine(query.ToQueryString());
ToQueryString()
不应该运行查询,只输出SQL。由于上面的测试 SQL 没有使用任何参数,所以应该不会抛出任何错误。我不明白是什么导致了这个错误?
此处创建查询对象:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<GetGroupDTO>().HasNoKey();
}
class保存查询结果:
public class GetGroupDTO
{
public Guid GroupId { get; }
public string SalesGroupName { get; }
public string Name { get; }
public Guid Owner { get; }
public string Status { get; }
public DateTime Start { get; }
public DateTime End { get; }
public string AccountRole { get; }
private bool Suspended { get; }
public DateTime Created { get; }
public DateTime LastUpdated { get; }
public Guid ChangedBy { get; }
public ulong _eTag { get; }
private GetGroupDTO() { }
}
是否需要任何其他代码来回答这个问题?
更新:
我尝试了另一个 SQL 语句,该语句使用了用于写入的组对象。这次电话接通了。错误似乎来自查询对象的声明。
var group = _dbContext.Set<Group>()
.FromSqlRaw("SELECT * FROM OD.[Group]").ToList();
为您的属性添加 set
或 init
。 EF Core 无法为只读属性生成赋值,这就是它失败的原因。
可能他们必须为这种情况抛出更多信息异常。
第一次使用EF Core的查询方式。因为我的带参数的大型查询也引发了异常“序列不包含任何元素”。
System.InvalidOperationException
HResult=0x80131509
Message=Sequence contains no elements
Source=System.Linq
StackTrace:
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.Max(IEnumerable`1 source)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.ShaperProcessingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
at System.Linq.Expressions.BlockExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.ShaperProcessingExpressionVisitor.VisitExtension(Expression extensionExpression)
at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.ShaperProcessingExpressionVisitor.ProcessShaper(Expression shaperExpression, RelationalCommandCache& relationalCommandCache, LambdaExpression& relatedDataLoaders, Int32& collectionId)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.VisitShapedQuery(ShapedQueryExpression shapedQueryExpression)
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.VisitExtension(Expression extensionExpression)
at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToQueryString(IQueryable source)
at Elwis.Orders.Persistence.GroupQueries.GetGroups(AccountId accountId, SalesGroupId salesGroupId, GroupStatus groupStatus, GroupAccountRole groupAccountRole, PermissionLevel permissionLevel, String sortingColumn, SortingDirection sortingDirection, Int32 pageSize, Int32 pageNumber) in C:\Users\micro\source\repos\rtsforder\Elwis.Orders.Persistence\Read\Queries\GroupQueries.cs:line 50
This exception was originally thrown at this call stack:
[External Code]
Elwis.Orders.Persistence.GroupQueries.GetGroups(Elwis.SharedKernel.Domain.AccountId, Elwis.Orders.Domain.SalesGroupId, Elwis.Orders.Domain.GroupStatus, Elwis.Orders.Domain.GroupAccountRole, Elwis.SharedKernel.Domain.PermissionLevel, string, Elwis.SharedKernel.Domain.Enums.SortingDirection, int, int) in GroupQueries.cs
我简化了 sql 代码以定位错误并从联接表返回常量值。我用ToQueryString()
将生成的SQL输出到控制台。
var query = _dbContext.Set<GetGroupDTO>().FromSqlRaw(@"
Select GroupId, SalesGroupName='RTSF', Name, Owner, Status='OPEN',
[Start], [End], AccountRole='Owner', Suspended,
Created, LastUpdated, ChangedBy, _eTag
FROM OD.[Group]");
Console.WriteLine(query.ToQueryString());
ToQueryString()
不应该运行查询,只输出SQL。由于上面的测试 SQL 没有使用任何参数,所以应该不会抛出任何错误。我不明白是什么导致了这个错误?
此处创建查询对象:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<GetGroupDTO>().HasNoKey();
}
class保存查询结果:
public class GetGroupDTO
{
public Guid GroupId { get; }
public string SalesGroupName { get; }
public string Name { get; }
public Guid Owner { get; }
public string Status { get; }
public DateTime Start { get; }
public DateTime End { get; }
public string AccountRole { get; }
private bool Suspended { get; }
public DateTime Created { get; }
public DateTime LastUpdated { get; }
public Guid ChangedBy { get; }
public ulong _eTag { get; }
private GetGroupDTO() { }
}
是否需要任何其他代码来回答这个问题?
更新:
我尝试了另一个 SQL 语句,该语句使用了用于写入的组对象。这次电话接通了。错误似乎来自查询对象的声明。
var group = _dbContext.Set<Group>()
.FromSqlRaw("SELECT * FROM OD.[Group]").ToList();
为您的属性添加 set
或 init
。 EF Core 无法为只读属性生成赋值,这就是它失败的原因。
可能他们必须为这种情况抛出更多信息异常。