1

OK、私はこれで頭を壁にぶつけています ;-)

データベース内の Address、Customer、および CustomerType という名前のテーブルを指定して、顧客に関する概要情報を組み合わせて表示したいので、これら 2 つのテーブルを結合して特定の結果を取得するクエリを作成します。

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

何らかの理由で、これは機能しません。CustomerSummaryView の結果の IEnumerable リストを取得します。各レコードには顧客名と郵便番号がありますが、顧客タイプ フィールドは常に null です。

さまざまなデータベース テーブルと投影されたクラスを使用して、この問題を数回再現しました。

誰でもアイデアはありますか?

4

4 に答える 4

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

}

これで無事合格。そこに予約語を使用しているかどうか疑問に思っていますか?

于 2009-07-15T19:54:17.283 に答える
0

この投稿は同様の問題に言及しているようです...

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

于 2009-07-29T10:46:09.103 に答える
0

このスレッドの最後のポスターから約 2 か月後の 2010 年 3 月 21 日から最新のビルドをダウンロードしましたが、パッケージ化されたバイナリにまだ問題が存在します。残念。

ここで私がしなければならないこと:

        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 になります。非常に奇妙な。

于 2010-09-30T15:28:47.203 に答える
0

はい、Rob の例が機能する理由は、Rob のプロジェクションのプロパティ名が正確に一致するためです。一方、John の元の例では、CustomerType と type.Description に違いがあります。

これは問題ではなかったはずですが、問題がありました。プロジェクション マッパーは同じ名前のプロパティを探していて、一致が見つからない場合は値をマッピングしていませんでした。したがって、名前が完全に一致しない場合、投影オブジェクトのプロパティはそのタイプのデフォルト値になります。

良いニュースは、今日最新のソースを入手し、新しい Subsonic.Core.dll をビルドしたところ、動作が修正されたことです。

したがって、上記の John のコードは期待どおりに動作するはずです。

于 2010-01-27T02:00:26.477 に答える