我的对象(oJobs
)的属性如下:
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”,其中每个数字代表存储在另一个表格中的品牌ID。
我的选择查询如下:
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
将返回一个字符串,我将需要拆分该字符串,并为每个数字运行另一个查询以最终返回并将一个List(DAL.Brand
)分配到.PostBrandList
对于那些可能会问“你有什么尝试?”的人,
另外,我不允许规范化DB :(
答案 0 :(得分:0)
未经测试,可能需要进行一些调整,但这只是一个想法。您还需要将属性更改为IEnumerable而不是List。因为第二个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
}
答案 1 :(得分: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 server),这样你就可以使用join并提高性能。
答案 2 :(得分: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语法可能不好,你应该在代码中实现它时检查一下。
答案 3 :(得分:0)
也许您只想将列品牌上的Split功能用于数组并迭代结果,使用Find函数检索品牌对象?