linq to sql и извлечение только определенных строк из объединенных таблиц - PullRequest
1 голос
/ 20 января 2009

У меня есть две таблицы 1) Товар 2) Категории

Таблица продукта имеет поле с именем «CategoryID», а таблица «Категория» имеет поле с именем «CategoryName», ID, DateCreated и некоторые другие.

Я хочу использовать LINQ to SQL для запроса всех строк Product, а также просто Category.CategoryName. Этот запрос будет использоваться в источнике данных и будет привязан к ListView.

Я знаю, что могу использовать опцию LoadWith с DataContext и объединением. Но проблема в том, что я получаю все строк из Product и Category. Что я действительно хочу, так это все строки из Product и просто Category.CategoryName

Идеальным решением было бы, если бы опция LoadWith позволила бы вам указать возвращаемые поля, но, поскольку ответил здесь , это невозможно.

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

public class ProductInfo
{
   public string ProdName { get; set; }
   public int ProdID { get; set; }
   public int CategoryID { get; set; }
   public string CategoryName { get; set; } 
}

но проблема в том, что оператор select заканчивается очень долго. например ...

var products = from p in db.Products
               join c in db.Categories on p.CategoryID = c.ID
               select new ProductInfo { ProdName = p.ProdName, ProdID = p.ID,
 CategoryID = p.CategoryID, CategoryName = c.CategoryName }

это становится действительно подверженным ошибкам.

Итак, мой вопрос - есть ли лучший способ сделать это?

Редактировать / Разъяснение: я должен был упомянуть, что ПРИЧИНА, мне нужен промежуточный класс, заключается в том, что мне нужно иметь возможность возвращать набор результатов как определенный тип, в данном случае ProductInfo

Ответы [ 3 ]

1 голос
/ 20 января 2009

Я думаю, вы на правильном пути, но я бы не стал беспокоиться о промежуточном классе:

var products = from p in db.Products
           join c in db.Categories on p.CategoryID = c.ID
           select new { p.ProdName, ProdId = p.ID, p.CategoryID, 
              CategoryName = c.CategoryName }

Затем вы можете подключить это в событии Selecting LinqDataSource. Скотт Гатри рассказывает об этом в разделе «Выполнение пользовательских запросов с использованием события выбора» в своем посте « Использование пользовательского выражения Linq с asp: LinqDataSource« control ».

0 голосов
/ 20 января 2009
List<ProductInfo> products = (from p in db.Products
               join c in db.Categories on p.CategoryID = c.ID
               select new ProductInfo { ProdName = p.ProdName, ProdID = p.ID,
 CategoryID = p.CategoryID, CategoryName = c.CategoryName }).ToList<ProductInfo>();
0 голосов
/ 20 января 2009

о боже, я должен был упомянуть, что ПРИЧИНА мне нужен промежуточный класс, потому что мне нужно иметь возможность возвращать набор результатов как определенный тип, в данном случае ProductInfo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...