2015-11-26 2 views
0

Я немного слаб в LINQ to SQL, поэтому попытаюсь объяснить мою проблему.Получить еще один класс из запроса LINQ to SQL

У меня есть метод следующим образом (упрощенно объяснить это лучше):

public static List<ic_ProductData> GetCompleteSimilarProductsWithApplyButton(InfoChoiceAdminDataContext db) 
{ 

    var products = (from 
         p in db.ic_ProductDatas 
        join proddef in db.ic_ProductDefs on p.ProductDefId equals proddef.ProductDefId 

        select p 
         ).ToList(); 

    return products; 
} 

ic_ProductData и ic_ProductDefs столы в моей базе данных

ic_ProductData класс содержит вручную созданный свойство, как:

public ic_ProductDef RelatedProductDef { get; set; } 

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

Обратите внимание, что я не хочу другого вызова в базе данных.

Также есть много свойств в ic_ProductData, поэтому я хочу, чтобы избежать отображения и каждый дом

Что-то эффект следующее (очевидно, ниже неправильно):

public static List<ic_ProductData> GetCompleteSimilarProductsWithApplyButton(InfoChoiceAdminDataContext db) 
{ 

    var products = (from 
         p in db.ic_ProductDatas 
        join proddef in db.ic_ProductDefs on p.ProductDefId equals proddef.ProductDefId 
        //trying to change here 
        select new ic_ProductData 
        { 
         //do something with p here so that all the properties of new object gets filled 
         // avoid mapping of properties here 
         RelatedProductDef = proddef 
        } 
         ).ToList(); 

    return products; 
} 

С мои ограниченные знания я застрял здесь.

Пожалуйста, помогите!

Заранее благодарен!

ответ

2

Вы можете сделать что-то вроде этого:

var query = (from p in db.ic_ProductDatas 
       join proddef in db.ic_ProductDefs on p.ProductDefId equals proddef.ProductDefId 
       select new 
       { 
        ProductData = p, 
        Def = proddef 
       }).ToList(); 

List<ic_ProductData> products = new List<ic_ProductData>(); 
foreach(var product in query) 
{ 
    product.ProductData.RelatedProductDef = product.Def; 
    products.Add(product); 
} 

Основном, сначала нужно сделать один запрос к базе данных, это возвращает анонимный тип, содержащий как ваш продукт и его защиту. Наконец, вы зацикливаете (в памяти, нет db-вызовов!) Над ними, создавая свои конечные объекты с их заселенными объектами RelatedProductDef.

+0

'.ToList()' не нужно, поскольку оператор возвращает 'System.Linq.IQueryable <>', который может быть использован в цикле foreach вместо – ViRuSTriNiTy

+1

@ViRuSTriNiTy это действительно не нужно, я нахожу его влияние (в производительности) минимальны. –

+0

@Tom Wuyts Это кажется хорошим решением. Дайте ему шанс! Скоро вас обновит. Проголосуйте от меня. – samar

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