Asp.net core 财产';系统&x27;未为类型';Microsoft.EntityFrameworkCore.Storage.ValueBuffer';
我得到了这个运行时异常 未为类型定义属性“System.String Name” '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;
订单
类
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核心翻译/处理错误外,我不知道如何让LastTraceStatus
检查其名称(我从您的查询中得到了不同的异常,但无论如何),基本上,您应该避免使用Last
函数,并在应用排序运算符后使用First
/FirstOrDefault
/Take(1)
,因为没有显式排序运算符,返回记录的顺序是未定义的,因此“First”、“Last”等没有任何意义
根据注释,目标是找到OrderDetail
的最后一个TrackStatus
(其中last表示具有maxTrackStatusId
)并检查其名称是否与条件匹配
第一部分可以通过“导航”到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
记录时,哪一条是“最后一条”-具有maxTrackStatusId的记录
或???“具有max TrackStatusId的记录”->是@IvanstoevThank@Ivan,我已经尝试了您的代码,但它没有按预期工作。感谢您的回答,我已经编写了自己的存储过程来解决问题,而不是使用linkq