【问题标题】:Problem creating an Entity object/queryable from the result of a LINQ join in MVC从 MVC 中的 LINQ 连接的结果创建实体对象/可查询的问题
【发布时间】:2013-08-02 05:25:56
【问题描述】:

我正在尝试为需要使用实体框架访问相关表中的信息的数据库表编写搜索函数。但是,在对父表和相关表进行连接后,我遇到了从初始查询中取回数据的问题。我的代码目前看起来像这样。我初始化我的可查询对象

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。

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

【问题讨论】:

  • 不支持投影到映射的实体类型。

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


【解决方案1】:

我认为你让这变得比它需要的更复杂。如果我了解您要执行的操作,您应该可以执行以下操作:

if (!String.IsNullOrEmpty(searchViewModel.Comment)){
  po = po.Where(
     o => o.PurchaseOrderComments.Any(
       c => c.CommentText.Contains(searchViewModel.Comment)));
}

【讨论】:

    【解决方案2】:

    StriplingWarrior 的解决方案是最好的方法。如果您的 PurchaseOrder 类确实没有 PurchaseOrderComments 的导航集合(这将迫使您使用连接),则以下应该可以工作并且比您的双重投影更简单:

    po=po.Join(helper, r => r.PurchaseOrderID, u => u.PurchaseOrderID, (r, u) => r);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多