2010-02-22 3 views
2

Итак, у меня есть класс, который создается при создании соединения Linq to SQL.Linq to SQL: заполнение расширенного сгенерированного класса в запросе Linq

Это в основном выглядит следующим образом:

 

    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.Categor y.Description».

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

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

Я также думал о создании конструктора на моем частичном классе, который принимает продукт (выберите P) и категорию (выберите p.Category.Description)

Doing что-то вроде этого:


    // 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 и устанавливать каждый из них отдельно?

+1

Im confused .... мысль Категория была строкой? Свойства расширения невозможно в C# ... – James

+0

Категория - это строка в моем расширенном классе. Но это таблица в базе данных. Я буду использовать поле «Описание» в таблице «Категория», чтобы заполнить свойство «Категория» в моем расширенном классе :) – Eoinii

ответ

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

Второй пример - это риск неожиданной ленивой загруженности. –

+0

@marc, да, хороший момент, хотя мой первый вариант уже упоминает Поко (во избежание этого). Пока класс используется в правильном контексте, должно быть хорошо. Просто придать OP другой вариант. – James

+0

@Marc - Да, я надеялся не делать свой первый ответ - это то же самое, что использовать конструктор и устанавливать все свойства в нем. Хммммм, возможно, то, что я пытаюсь сделать, невозможно :(Мне просто нужно заполнить объекты, установив каждое свойство по отдельности. – Eoinii

1

LINQ-to SQL играет хорошо, пока вы позволяете ему делать свою вещь самостоятельно. IMO, best способ справиться с этим сценарием - оставить 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 
       }; 

Это позволит вам получить ваши данные из, без молчаливого п + 1 вопросы и без данных контекста жалуюсь. Это также означает, что вы полностью контролируете, какие столбцы запрашиваются и как они отображаются.

В основном это использует LINQ-to-SQL только для интеграции с базой данных, используя наш собственный тип для основного приложения.

+0

@Marc - На самом деле это будет удобно с хранимыми процедурами, о которых я в двух умах об использовании, приветствия :) – Eoinii

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

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

Смежные вопросы