【问题标题】:Subsonic 3 Linq Projection Issue亚音速 3 Linq 投影问题
【发布时间】:2009-07-09 16:35:46
【问题描述】:

好吧,我正用这个把头撞到墙上 ;-)

给定我的数据库中名为 Address、Customer 和 CustomerType 的表,我想显示有关客户的组合摘要信息,因此我创建了一个查询来连接这两个表并检索指定的结果。

 var customers = (from c in tblCustomer.All()
                        join address in tblAddress.All() on c.Address equals address.AddressId
                        join type in tblCustomerType.All() on c.CustomerType equals type.CustomerTypeId
                        select new CustomerSummaryView
                                   {
                                       CustomerName = c.CustomerName,
                                       CustomerType = type.Description,
                                       Postcode = address.Postcode
                                   });

  return View(customers);

CustomerSummaryView 是一个简单的 POCO

public class CustomerSummaryView
{
    public string Postcode { get; set; }
    public string CustomerType { get; set; }
    public string CustomerName { get; set; }
}

现在由于某种原因,这不起作用,我得到一个 IEnumerable 的 CustomerSummaryView 结果列表,每条记录都有一个客户名称和一个邮政编码,但客户类型字段始终为空。

我已经用不同的数据库表和投影类多次重现了这个问题。

有人有什么想法吗?

【问题讨论】:

    标签: linq activerecord subsonic3


    【解决方案1】:

    我无法重现这个问题 - 这是我刚刚尝试过的测试:

    [Fact]
    public void Joined_Projection_Should_Return_All_Values() {
        var qry = (from c in _db.Customers
                         join order in _db.Orders on c.CustomerID equals order.CustomerID
                         join details in _db.OrderDetails on order.OrderID equals details.OrderID
                         join products in _db.Products on details.ProductID equals products.ProductID
                         select new CustomerSummaryView
                         {
                             CustomerID = c.CustomerID,
                             OrderID = order.OrderID,
                             ProductName = products.ProductName
                         });
    
        Assert.True(qry.Count() > 0);
    
        foreach (var view in qry) {
            Assert.False(String.IsNullOrEmpty(view.ProductName));
            Assert.True(view.OrderID > 0);
            Assert.False(String.IsNullOrEmpty(view.CustomerID));
        }
    
    }
    

    这完全通过了。我想知道您是否在其中使用了保留字?

    【讨论】:

    • 嘿 Rob,我认为您的测试通过了,因为您的映射完全匹配。 Jon 正在做 CustomerType = type.Description,而这恰好是他遇到问题的唯一属性。我遇到了非常相似的stackoverflow.com/questions/1734146/…
    【解决方案2】:
    【解决方案3】:

    是的,Rob 的示例有效的原因是因为他的投影的属性名称完全匹配,而 John 的原始示例在 CustomerType 和 type.Description 之间存在差异。

    这不应该是一个问题,但它是 - 投影映射器正在寻找同名的属性,如果没有找到匹配项,则不会映射一个值。因此,如果名称不完全匹配,您的投影对象的属性将是其类型的默认值。

    好消息是,我今天获得了最新的源代码并构建了一个新的 Subsonic.Core.dll,该行为现已修复。

    所以上面 John 的代码应该可以按预期工作。

    【讨论】:

      【解决方案4】:

      我刚刚从 2010 年 3 月 21 日下载了最新版本,距此线程上的最后一张海报大约 2 个月后,打包的二进制文件中仍然存在问题。无赖。

      这是我必须做的:

              var data =
                  (from m in Metric.All()
                   where m.ParentMetricId == parentId
                   select new
                          {
                               m.MetricName,
                               m.MetricId,
                          })
                          .ToList();
      
              var treeData =
                  from d in data
                  select new TreeViewItem
                          {
                              Text = d.MetricName,
                              Value = d.MetricId.ToString(),
                              LoadOnDemand = true,
                              Enabled = true,
                          };
      
              return new JsonResult { Data = treeData };
      

      如果我尝试直接从 Subsonic 查询进行投影,则 Text 属性以 ID 结尾,而 Value 属性以 Name 结尾。很奇怪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多