0

свойства из моего объекта (oJobs) выглядят следующим образом:Вызов функции внутри Entity Framework Select

Private _brandlist As List(Of DAL.Brand) 
    Public Property PostBrandList() As List(Of DAL.Brand) 
     Get 
      Return _brandlist 
     End Get 
     Set(ByVal value As List(Of DAL.Brand)) 
      _brandlist = value 
     End Set 
    End Property 

В базе данных, список бренда хранятся в виде строки, разделенной запятая, например, колонка «бренды» может быть строкой «3,45,2», где каждый номер представляет собой идентификатор бренда, хранящегося в другой таблице.

мой запрос на выборку, как показано ниже:

Dim jobposts As List(Of oJobs) = From j In db.JobPostings 
Select New oJobs With {                 'hiding all others for code brevity 
    .PostBrandList = 'problem is here' 
} 

С j.BrandList возвращает строку, мне нужно будет разделить эту строку и для каждого номера, запустить другой запрос, чтобы, наконец, вернуться и назначить списка (DAL.Brand) в .PostBrandList

для тех, кто мог бы спросить: «Что вы пробовали?»,

  • Я запустить запрос, а затем сделал для каждого, чтобы добавить список брендов позже - успешно, но не оптимально
  • Закодирована функция, которая принимает список как параметр и возвращает отдельный список объектов - очень глупо.

Кроме того, я не позволил нормализовать БД :(

+0

Отправьте запрос, чтобы получить список идентификаторов, как вы уже пробовали. Создайте массив с идентификаторами и отправьте второй запрос и используйте '.Contains', чтобы получить все объекты с идентификаторами. Кроме того, создайте хранимую процедуру, которая делает это в базе данных. – Pawel

+1

Правильный способ сделать это - ПОЛУЧИТЬ ПОЛУЧЕНИЕ КОЛОНКИ БРЕНДОВ. Это то, что мы называем внутренним эффектом платформы, а не правильным способом делать реляционные данные в РСУБД.У вас должна быть таблица, соединяющая ваши бренды с вашими работами. Это поможет в долгосрочной перспективе из-за лучшей индексации и т. Д. – Aron

+1

Привет, Арон, прочитайте мое последнее предложение. В противном случае я полностью согласен с вами и много пробовал передумать! –

ответ

0

Не тестировались и, возможно, потребуется перенастройка, но Херес одну идеи. Вам также нужно будет изменить свойство к IEnumerable, а не список. Поскольку второй запрос LINQ встроен в первый, я считаю, что он должен выполнить все это, как один запрос, но вы должны проверить, чтобы убедиться.

Dim jobposts As List(Of oJobs) = From j In db.JobPostings 
Select New oJobs With {                 'hiding all others for code brevity 
    .PostBrandList = From b In db.Brands Where j.Brands = b.ID Or j.Brands.StartsWith(b.ID & ",") Or j.Brands.EndsWith("," & b.ID) Or j.Brands.Contains("," & b.ID & ",") Select b 
} 
0

в C# можно использовать

.Select(x=>new {x.BrandList}) 
.ToList() //Materialize first before calling function 
.Select(x=> new oJobs{ 
    PostBrandList = 
     db.Brands.Where(z=> 
     x.BrandList 
      .Split(',') 
      .Select(y=>int.Parse(y.Trim())) 
      .Contains(z.Id)) 
      .ToList() 
}); 

Обратите внимание, что вы должны материализовать сущность сначала перед вызовом String.Split Я не знаю, как перевести это на VB.NET. Конечно, это вызовет проблему SELECT n+1, потому что вы не можете использовать соединение.

Если вы не можете нормализовать таблицу, мое другое предложение - создать индексированный вид (sql-сервер), чтобы вы могли использовать объединение и повысить производительность.

индексированных вид https://msdn.microsoft.com/en-us/library/ms191432.aspx

0

Вы можете попробовать его с Let заявление:

Dim jobposts As List(Of oJobs) = From j In db.JobPostings 
/* li in the LINQ Statement represents one string value from the BrandList list */ 
Let postBrandElemsList = j.BrandList.Split(',').Select(Function(li) New DAL.Brand With { ... /* Field initializatione of the Class DAL.Brand here */ } 
Select New oJobs With 
{ 
    .PostBrandList = postBrandElemsList 
} 

Я извиняюсь за, вероятно, плохой синтаксис VB.NET, вы должны проверить это при реализации его в коде ,

0

Возможно, вы просто захотите использовать функцию Split на марках столбцов в массиве и перебрать результат, используя функцию Find для извлечения объектов бренда?

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