我正在尝试为需要使用Entity Framework从相关表访问信息的数据库表编写搜索功能。但是,在父表和相关表上进行连接之后,我遇到了从初始查询中恢复数据的问题。我的代码目前看起来像这样。我初始化我的可查询对象
IQueryable<PurchaseOrder> po = _context.PurchaseOrders;
其中PurchaseOrder是实体类型。然后有一系列像这样的块。
if (!String.IsNullOrEmpty(searchViewModel.Comment)){
var helper = _context.PurchaseOrderComments.Where(x => x.CommentText.Contains(searchViewModel.Comment));
var mid = po.Join(helper, r => r.PurchaseOrderID, u => u.PurchaseOrderID, (r, u) =>
new
{
PurchaseOrderID = r.PurchaseOrderID,
PurchaseOrderNumber = r.PurchaseOrderNumber,
VendorID = r.VendorID,
ContractNumber = r.ContractNumber,
BuyerUserID = r.BuyerUserID
});
po = mid.Select(x => new PurchaseOrder
{
PurchaseOrderID = x.PurchaseOrderID,
PurchaseOrderNumber = x.PurchaseOrderNumber,
VendorID = x.VendorID,
ContractNumber = x.ContractNumber,
BuyerUserID = x.BuyerUserID
});
}
在每个块之后,将po传递给下一个搜索参数。但是,正如您可能猜到的,我的程序抱怨我无法在mid的Select语句中构建复杂类型。我还尝试从mid的内容构建PurchaseOrder对象,将它们插入到新的PurchaseOrders列表中,并将该列表转换为可查询以分配给po以传递给下一个块。但是,这将po的数据类型从System.Data.Object.ObjectSet更改为System.Collections.Generic.List,然后在下次尝试使用foreach迭代它时抛出InvalidOperationException。
所以我的问题是,我的方法中是否有任何明显的错误,或者有其他方法可以解决问题?非常感谢您的帮助。
答案 0 :(得分:2)
我认为你让它变得比它需要的更复杂。如果我理解你要做的事情,你应该能够做到这样的事情:
if (!String.IsNullOrEmpty(searchViewModel.Comment)){
po = po.Where(
o => o.PurchaseOrderComments.Any(
c => c.CommentText.Contains(searchViewModel.Comment)));
}
答案 1 :(得分:1)
StriplingWarrior的解决方案是最好的方法。如果您的PurchaseOrder
类实际上没有PurchaseOrderComments
的导航集合(会强制您使用联接),则以下内容应该可以正常工作,并且比您的双重投影更简单:
po=po.Join(helper, r => r.PurchaseOrderID, u => u.PurchaseOrderID, (r, u) => r);