Subsonic 3 Linq Проекция Проблема - PullRequest
1 голос
/ 09 июля 2009

Хорошо, я бью головой об стену этим; -)

Учитывая таблицы в моей базе данных, которые называются 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 ]

2 голосов
/ 15 июля 2009

Я не могу воспроизвести эту проблему - вот тест, который я только что попробовал:

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

}

Это прошло отлично. Мне интересно, если вы используете зарезервированное слово там?

0 голосов
/ 30 сентября 2010

Я только что загрузил последнюю сборку от 21.03.2010, то есть примерно через 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 };

Если я пытаюсь выполнить проекцию непосредственно из дозвукового запроса, свойство Text заканчивается идентификатором, а свойство Value заканчивается именем. Очень странно.

0 голосов
/ 27 января 2010

Да, причина того, что пример Роба работает, заключается в том, что имена свойств его проекции точно совпадают, тогда как в оригинальном примере Джона есть различие между CustomerType и type.Description.

Это не должно было быть проблемой, но это было так - Projection Mapper искал свойства с тем же именем и не отображал значение, если не нашел соответствия. Следовательно, свойства вашего проекционного объекта были бы значениями по умолчанию для его типа, если не было точного совпадения имени.

Хорошая новость в том, что я получил последний источник сегодня и создал новый Subsonic.Core.dll, и теперь поведение исправлено.

Таким образом, приведенный выше код Джона должен работать как положено.

0 голосов
/ 29 июля 2009

Это сообщение, похоже, относится к аналогичной проблеме ...

http://groups.google.com/group/subsonicproject/browse_thread/thread/2b569539b7f67a34?hl=en&pli=1

...