Asp.net core 财产';系统&x27;未为类型';Microsoft.EntityFrameworkCore.Storage.ValueBuffer';

Asp.net core 财产';系统&x27;未为类型';Microsoft.EntityFrameworkCore.Storage.ValueBuffer';,asp.net-core,.net-core,ef-core-2.0,Asp.net Core,.net Core,Ef Core 2.0,我得到了这个运行时异常 未为类型定义属性“System.String Name” 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer 当我试图运行查询时 我的模型关系如图所示: 这是我的模型课: 订单类 public class Order : BaseObject { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get;

我得到了这个运行时异常

未为类型定义属性“System.String Name” 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer

当我试图运行查询时

我的模型关系如图所示:

这是我的模型课:

订单

public class Order : BaseObject
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string OrderCode
    {
        get
        {
            return Constants.OrderCodePrefix + Id;
        }
    }
}
OrderDetail

public class OrderDetail : BaseObject
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id { get; set; }        

    public virtual Order Order { get; set; }

    public virtual TrackTrace TrackTrace { get; set; }
}
TrackTrace

public class TrackTrace
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TrackTraceId { get; set; }        

    public virtual List<TrackTraceStatus> TrackTraceStatus { get; set; }

    public Guid OrderDetailId { get; set; }

    [ForeignKey("OrderDetailId")]
    public virtual OrderDetail OrderDetail { get; set; }
}
TraceStatus

public class TrackStatus
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TrackStatusId { get; set; }

    public string Name { get; set; }

    public virtual List<TrackTraceStatus> TrackTraceStatus { get; set; }
}
 public class TrackTraceStatus : BaseObject
{
    public int TrackTraceId { get; set; }

    public virtual TrackTrace TrackTrace { get; set; }

    public int TrackStatusId { get; set; }

    public virtual TrackStatus TrackStatus { get; set; }
}
我删去了一些不必要的属性,使它变得简单。 这是我进行查询的服务类:

public class OrderService : IOrderService
{
    AuthContext _dbContext;
    public OrderService(AuthContext context, ICommonDataService commonDataService)
    {
        _dbContext = context;
    }

    private IQueryable<Order> IncludeTrackingChildrent()
    {
        return _dbContext.Orders.AsNoTracking()            
        .Include(o => o.OrderDetails)
            .ThenInclude(o => o.TrackTrace)
                .ThenInclude(tr => tr.TrackTraceStatus)
                    .ThenInclude(ts => ts.TrackStatus)
        .Where(o => o.OrderDetails.Any(m => !m.IsDeleted))            
        .Where(_ => !_.IsDeleted);
    }

    public async Task<BaseSearchResponse<Order>> Search(string trackStatus)
    {
        var response = new BaseSearchResponse<Order>();

        var query = IncludeTrackingChildrent();

        //search by tracking status
        if (!string.IsNullOrEmpty(trackStatus))
        {
            query = query.Where(x => x.OrderDetails.Any(d => d.TrackTrace.TrackTraceStatus.Last().TrackStatus.Name == trackStatus));
        }                    

        response.Items = query.Skip(0).Take(30).ToList();            

        response.Total = response.Items.Count();
        return response;
    }       
}
public类OrderService:IOrderService
{
AuthContext\u dbContext;
public OrderService(AuthContext上下文,ICommonDataService commonDataService)
{
_dbContext=context;
}
私人IQueryable包括跟踪儿童租金()
{
return _dbContext.Orders.AsNoTracking()
.Include(o=>o.OrderDetails)
.然后包括(o=>o.TrackTrace)
.然后包括(tr=>tr.tractestatus)
.然后包括(ts=>ts.TrackStatus)
.Where(o=>o.OrderDetails.Any(m=>!m.IsDeleted))
.Where(=>!u.IsDeleted);
}
公共异步任务搜索(字符串跟踪状态)
{
var response=新的BaseSearchResponse();
var query=IncludeTrackingChildrent();
//按跟踪状态搜索
如果(!string.IsNullOrEmpty(trackStatus))
{
query=query.Where(x=>x.OrderDetails.Any(d=>d.TrackTrace.TrackTraceStatus.Last().TrackStatus.Name==TrackStatus));
}                    
response.Items=query.Skip(0.Take(30.ToList));
response.Total=response.Items.Count();
返回响应;
}       
}
在我的系统中,
Order
有多个
OrderDetail
,每个
OrderDetail
都有一个
TrackTrace
表来跟踪交货状态,一个
TrackTrace
有1到5个
TrackStatus
如:订购、交货、ToOfficeA、ToOfficeB、ToCustomer。 查询目的是:获取具有任何
OrderDetail
Order
,该订单具有最后一个
TrackStatus
TrackStatus
,其名称等于输入字符串


当我尝试获取列表的元素时,问题出现了,我尝试了
TrackTraceStatus
,我尝试了
LastOrDefault()
LastOrDefault()First()
firstorddefault()
ElementAt()
。所有这些函数都给出了错误。除了EF核心翻译/处理错误外,我不知道如何让Last
TraceStatus
检查其
名称

(我从您的查询中得到了不同的异常,但无论如何),基本上,您应该避免使用
Last
函数,并在应用排序运算符后使用
First
/
FirstOrDefault
/
Take(1)
,因为没有显式排序运算符,返回记录的顺序是未定义的,因此“First”、“Last”等没有任何意义

根据注释,目标是找到
OrderDetail
的最后一个
TrackStatus
(其中last表示具有max
TrackStatusId
)并检查其名称是否与条件匹配

第一部分可以通过“导航”到
TrackStatus
记录,然后使用典型的for“last”
OrderByDescending
+
FirstOrDefault
模式来实现。对于第二部分,只需在调用
FirstOrDefault
之前选择
名称,然后将结果与所需名称进行比较:

query = query.Where(o => o.OrderDetails.Any(d => d.TrackTrace.TrackTraceStatus
    .Select(tts => tts.TrackStatus)
    .OrderByDescending(ts => ts.TrackStatusId)
    .Select(ts => ts.Name)
    .FirstOrDefault() == trackStatus));

定义“最后”。数据库查询中没有这样的术语。和“第一件”一样,顺便说一句。一定有一些订单。谢谢@IvanStoev,你能给我一个关于如何获得最后一件物品的建议吗?当然我可以试试。但你需要告诉我“最后”对你意味着什么。i、 e.一些订购标准。让我用不同的方式来表述。当您有多条
TrackStatus
记录时,哪一条是“最后一条”-具有max
TrackStatusId的记录
或???“具有max TrackStatusId的记录”->是@IvanstoevThank@Ivan,我已经尝试了您的代码,但它没有按预期工作。感谢您的回答,我已经编写了自己的存储过程来解决问题,而不是使用linkq