在Entity Framework Select中调用一个函数

时间:2015-02-25 16:09:07

标签: vb.net entity-framework linq-to-entities entity-framework-6

我的对象(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 :(

4 个答案:

答案 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并提高性能。

索引视图https://msdn.microsoft.com/en-us/library/ms191432.aspx

答案 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函数检索品牌对象?