2

さて、Linq から SQL への接続を作成したときに生成されたクラスがあります。

基本的には次のようになります。


    public partial class Product
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }

次のように、別のプロパティを追加して拡張しました。


    public partial class Product
    {
        public string Category { get; set; }    
    }

これで、製品の詳細を取得するための Linq クエリが次のようになります。


    public List GetProducts()
    {
        using(MyDataContext dc = new MyDataContext())
        {
            var products = from p in dc.Products
                           select p;
        }
    }

追加した新しいフィールド (Category) は、「p.Category.Description」を使用して Linq クエリで取得できます。

私の質問は、新しい Category プロパティを含む Product クラスを設定する最良の方法です。

Linq クエリ "select p" のデータを使用して、Product クラスの生成された部分を自動的に設定する方法があればいいのにと思います。

また、製品 (P を選択) とカテゴリ (p.Category.Description を選択) を受け入れる部分クラスにコンストラクターを作成することも考えました。

このようなことをする:


    // Linq query calling the constructor
    var products = from p in dc.Products
                   select new Product(p, p.Category.Description)

    // Product Constructor in my extended partial class
    public Product(Product p, string CategoryDescription)
    {
        this = p; // there must be a way to do something like this
        Category = CategoryDescription;
    }

しかし、Product クラスのすべてのプロパティをリストし、それぞれを個別に設定することなく、これを行う方法はありますか??

4

3 に答える 3

2

既存のコードを再利用したい場合は、代わりに Poco を作成する必要があります。

var products = from p in dc.Products
               select new Product
               {
                   Name = p.Name,
                   Description = p.Description,
                   Category = p.Category.Description
               }

または、さらに簡単にするために、次のようにします。

public partial class Product
{
    public string Category
    {
        get { return this.Category.Description; }
        set { this.Category.Description = value; }
    }
}
于 2010-02-22T12:17:34.977 に答える
1

LINQ-to-SQL は、それ自体で機能する限りうまく機能します。IMO、このシナリオを処理する最善の方法は、DBML で生成された型を DAL に残すことです。戻りたいものに 100% 適合する場合にのみ、それらを返します

代わりに、LINQ-to-SQL によって管理されない新しい型を作成し、代わりにこれを返します (非 DBML 型に対して初期化子ベースのプロジェクションを実行できます)。例えば:

var products = from p in dc.Products // p is implicitly a Product
               select new ExtendedProduct  // our completely unrelated type
               {
                   Id = p.Id,
                   Name = p.Name,
                   //...
                   Category = p.Category.Description
               };

これにより、サイレントな n+1 の問題やデータ コンテキストの不平を言うことなく、データを取得できるはずです。また、どの列がクエリされ、どのようにマップされるかを完全に制御できることも意味します。

基本的に、これはデータベース統合を行うためだけにLINQ-to-SQLを使用し、メイン アプリケーションに独自の型を使用します。

于 2010-02-22T12:18:56.803 に答える
0

あなたがやろうとしていることは次のようなものです:

using(MyDataContext dc = new MyDataContext())
{
    var products = from p in dc.Products
                   select p;
    foreach(Product p in products)
        p.Category = p.Category.Description;
}

...私には意味がありません。まず、「カテゴリ」の 1 つを別の名前にする必要があります。

于 2010-02-22T12:32:58.860 に答える