簡體   English   中英

EF Core 6 – ToQueryString() 在使用 FromSqlRaw 創建的查詢上拋出異常“序列不包含任何元素”

[英]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()到 output 生成的 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()不應該運行查詢,只是 output 和 SQL。由於上面的測試 SQL 不使用任何參數,它不應該拋出任何錯誤。 我不明白是什么導致了這個錯誤?

查詢 object 是在此處創建的:

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 語句,該語句使用了用於寫入的組 object。 這次電話接通了。 錯誤似乎來自查詢 object 的聲明。

var group = _dbContext.Set<Group>()
  .FromSqlRaw("SELECT * FROM OD.[Group]").ToList();

為您的屬性添加setinit EF Core 無法為只讀屬性生成分配,這就是它失敗的原因。

對於這種情況,他們可能必須拋出更多信息異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM