亚音速3 Linq投影问题

时间:2009-07-09 16:35:47

标签: linq activerecord subsonic3

好吧,我正用这个撞墙撞墙; - )

在我的数据库中给出名为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结果列表,每个记录都有一个客户名称和一个邮政编码,但客户类型字段始终为空。

我使用不同的数据库表和投影类多次重新创建此问题。

任何想法?

4 个答案:

答案 0 :(得分:2)

我不能重复这个问题 - 这是我刚试过的一个测试:

[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));
    }

}

这完美地传递了。我想知道你是否在那里使用保留字?

答案 1 :(得分:0)

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

我刚刚从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查询进行投影,文字属性最终会显示ID,属性最终会显示名称。很奇怪。