从MVC中的LINQ连接的结果创建实体对象/可查询的问题

时间:2011-08-11 21:50:04

标签: asp.net-mvc linq entity-framework

我正在尝试为需要使用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。

所以我的问题是,我的方法中是否有任何明显的错误,或者有其他方法可以解决问题?非常感谢您的帮助。

2 个答案:

答案 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);