#c# #asp.net #sql #linq #lambda
#c# #asp.net #sql #linq #лямбда
Вопрос:
Я работаю с Entity Framework. Я должен применить объединение двух таблиц, но чего я хочу, если есть одна таблица, Category
со столбцом categoryid
в качестве внешнего ключа, который имеет целочисленный тип данных, и другая таблица, Products
со столбцом id
в качестве первичного ключа, который также имеет целочисленный тип данных.
Теперь мне нужно выбрать только те записи из Products
таблицы, которые имеют id
то, что содержится в Category
таблице.
Это мой код:
string categoryid= "10,11,12";
datalist.DataSource = (from p in objCategory
join q in objProducts on p.categoryid.contains(q.id)
select new
{
p.FilePath,
p.ItemName,
p.Description,
q.image_url,
q.name,
q.price
}).ToList();
Ответ №1:
Вы могли бы сделать что-то вроде этого:
List<int> categoryIds = new List<int>(){ 10, 11, 12 };
datalist.DataSource = (from c in objCategory
join p in objProducts
on c.categoryid equals p.categoryid
where categoryIds.Contains(c.categoryid)
select new
{
c.FilePath,
c.ItemName,
c.Description,
p.image_url,
p.name,
p.price
}).ToList();
Ответ №2:
Вместо того, чтобы извлекать все данные в память и затем объединять, лучше создать свойства навигации и извлекать данные по этим свойствам. В этом сценарии все объединение будет работать внутри базы данных, и вы получите только отфильтрованные данные из базы данных. Решение будет работать следующим образом
class Category
{
public int CategoryId { get; set; }
public string Description{ get; set; }
public string FilePath {get;set;}
public string ItemName {get;set;}
public virtual ICollection<Product> Product{ get; set; }
}
class Product
{
public int ProductId { get; set; }
public string name{ get; set; }
public int CategoryId { get; set; }
public string Product.image_url {get;set;}
public int price {get;set;}
public virtual Category Category{ get; set; }
}
Теперь вам просто нужно вызвать следующий запрос
datalist.DataSource = (from p in objCategory.Include("Product")
select new
{
p.FilePath,
p.ItemName,
p.Description,
p.Product.image_url,
p.Product.name,
p.Product.price
}).ToList();