Linq to SQL: заполнение расширенного сгенерированного класса в запросе Linq - PullRequest
2 голосов
/ 22 февраля 2010

Хорошо, у меня есть класс, сгенерированный при создании соединения Linq to 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;
        }
    }

Новое поле, которое я добавил (Категория), можно получить в запросе Linq с помощью «p.Category.Description».

Так что мой вопрос в том, каков наилучший способ заполнить класс Product, включая новое свойство Category.

Я бы предпочел, если бы был способ автоматически заполнить сгенерированную часть класса Product, используя данные в запросе Linq "select p".

Я также думал о создании конструктора в моем частичном классе, который принимает продукт (выберите 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 и устанавливать каждое из них по отдельности ??

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Если вы хотите повторно использовать существующий код, вам придется вместо этого создать 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; }
    }
}
1 голос
/ 22 февраля 2010

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 , просто , чтобы выполнить интеграцию с базой данных, используя наш собственный тип для основного приложения.

0 голосов
/ 22 февраля 2010

Похоже, что вы пытаетесь сделать что-то вроде этого:

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

... что не имеет никакого смысла для меня. Начнем с того, что одну из «Категорий» нужно будет называть как-нибудь еще.

...