c# - .net 5 MVC,使用过滤列表过滤第二个列表
问题描述
我将首先列出我的代码中的内容。
工单模型
public class WorkOrderModel
{
public int RowID { get; set; }
[Key]
public string Type { get; set; }
[Key]
public string Base_ID { get; set; }
[Key]
public string Lot_ID { get; set; }
[Key]
public string Split_ID { get; set; }
[Key]
public string Sub_ID { get; set; }
#nullable enable
public string? Part_ID { get; set; }
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Close_Date { get; set; }
public char Status { get; set; }
}
public class OperationModel
{
[Key]
public short Sequence_No { get; set; }
public string Resource_Id { get; set; }
[Column(TypeName = "decimal(7, 2)")]
public decimal Run_Hrs { get; set; }
[Column(TypeName = "decimal(7, 2)")]
public decimal Act_Run_Hrs { get; set; }
public string Operation_Type { get; set; }
public char Status { get; set; }
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Close_Date { get; set; }
[Key]
public string WorkOrder_Type { get; set; }
[Key]
public string WorkOrder_Base_ID { get; set; }
[Key]
public string WorkOrder_Lot_ID { get; set; }
[Key]
public string WorkOrder_Split_ID { get; set; }
[Key]
public string WorkOrder_Sub_ID { get; set; }
}
然后WOListViewModel
结合以上两个(还有更多,但它们还没有使用)
public class WoListViewModel
{
public IQueryable<WorkOrderModel> WorkOrders { get; set; }
public IQueryable<OperationModel> Operations { get; set; }
public IQueryable<PartModel> Parts { get; set; }
public IQueryable<LaborTicketModel> LaborTickets { get; set; }
}
和我的 WorkOrderController
public IActionResult Index(string woSearch = null, string tcSearch = null, string tdSearch = null)
{
WoListViewModel woListViewModel = new()
{
WorkOrders = _dbContext.Work_Order.Where(w => w.Sub_ID != "0")
};
if (!string.IsNullOrEmpty(tdSearch))
{
woListViewModel.Operations = _dbContext.Operation.Where(o => o.Resource_Id == tdSearch);
woListViewModel.WorkOrders = woListViewModel.WorkOrders.Where(w => (w.Base_ID + "-" + w.Sub_ID + "/" + w.Lot_ID) ==
(from o in woListViewModel.Operations
select (o.WorkOrder_Base_ID + "-" + o.WorkOrder_Sub_ID + "/" + o.WorkOrder_Lot_ID)).ToQueryString()
);
}
}
我想要在下面做的IActionResult
是if (!string.IsNullOrEmpty(tdSearch))
过滤woListViewModel.Operations
器tdSearch
。然后使用结果进行过滤woListViewModel.WorkOrders
。两种模型都具有 SQL Server 中常见的 Base_ID、Sub_ID、Lot_ID(虽然列名不准确,但它们是匹配数据),如果我要在 Excel 中进行此两阶段过滤,我可以先在 PowerQuery 中合并两个表然后筛选。
虽然我不知道我是否以某种方式正确地执行此操作,但我能够在 Visual Studio 中编写控制器代码而不会出现错误,但是当它运行时会产生以下错误。
InvalidOperationException: The LINQ expression 'DbSet<OperationModel>()
.Where(o => o.Resource_Id == __tdSearch_0)
.Select(o => o.WorkOrder_Base_ID + "-" + o.WorkOrder_Sub_ID + "/" + o.WorkOrder_Lot_ID)
.ToQueryString()' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
正如它的建议,我改为.ToQueryString()
列出的其他人,但没有成功。
请帮帮我。先感谢您。
解决方案
通过另一个列表 C# 过滤列表 从上面的链接中找到答案,然后将我的代码更改如下。
woListViewModel.WorkOrders = woListViewModel.WorkOrders
.Where(w => woListViewModel.Operations
.Any(o => (o.WorkOrder_Base_ID + "." + o.WorkOrder_Sub_ID + "." + o.WorkOrder_Lot_ID)
.Equals(w.Base_ID + "." + w.Sub_ID + "." + w.Lot_ID)));
推荐阅读
- clojure - lein uberjar 导致“方法代码太大!”
- php - PHP:如何回显一行 if..else 语句(数组、SQL)?
- system.reactive - 如何在 Observable 链中重用对象实例?
- python - 在pygame中找到精灵的位置
- java - java swing中的绝对定位图像图标
- arrays - 如何遍历 JSON 数组
- reactjs - 如何在没有 redux 的情况下在 React App 中保存和更改大对象?
- php - While 语句不显示 ECHO
- java - 如何以编程方式将项目添加到 activity_main_drawer.xml 中的菜单
- vba - 为什么我们需要 Application.PathSeparator?