Vb.net 使用LINQ到实体-如何连接/连接另一个表中的列

Vb.net 使用LINQ到实体-如何连接/连接另一个表中的列,vb.net,entity-framework,Vb.net,Entity Framework,我在试图找出将一系列名称列从单独的表连接/连接到查询中的正确方法或语法时遇到了一些问题 目前我正在LINQpad中使用两个查询进行测试;第一个返回我用于其他后台工作的所有主数据,第二个是绑定到DGV的用户友好版本。当我尝试加入医生的名字时,问题就出现了,就像我为一个单独的组合框所做的那样 这就是我到目前为止所做的——虽然它确实返回医生的姓名,但如果医生表上的TITLE字段为空,它将不会返回姓名 Dim query1 = (From demog In data_Demogs Fro

我在试图找出将一系列名称列从单独的表连接/连接到查询中的正确方法或语法时遇到了一些问题

目前我正在LINQpad中使用两个查询进行测试;第一个返回我用于其他后台工作的所有主数据,第二个是绑定到DGV的用户友好版本。当我尝试加入医生的名字时,问题就出现了,就像我为一个单独的组合框所做的那样

这就是我到目前为止所做的——虽然它确实返回医生的姓名,但如果医生表上的TITLE字段为空,它将不会返回姓名

Dim query1 = (From demog In data_Demogs
        From MedHist In data_Demog_MedHists.where(Function(a) demog.ID_Demog = a.ID_Demog).defaultifempty
        From BGLAssay In data_Demog_BGLs.where(Function(a) demog.ID_Demog = a.ID_Demog).defaultifempty
        Select 
        demog.ID_Demog, 
        demog.Last_Name, 
        demog.First_Name, 
        demog.ID_Demog_AKA,
        demog.DOB,
        demog.Gender,
        demog.ST_Complete, 
        demog.LT_Complete, 
        demog.LT_Due_Date, 
        demog.ID_Physician,
        demog.ID_Reason_For_Call,
        demog.Intl_Patient,
        demog.Mayo_Patient,
        MedHist.ID_Disease_Group, 
        MedHist.ID_Disease_Type,
        BGLAssay.ID_BGL_Assay)

Dim query2 = (From items In query1
        From demogAKA In data_Demogs.Where(Function(a) items.ID_Demog = a.ID_Demog_AKA).defaultifempty
        From DType In tbl_Disease_Types.Where(Function(a) items.ID_Disease_Type = a.ID_Disease_Type).defaultifempty
        From DGroup In tbl_Disease_Groups.Where(Function(a) items.ID_Disease_Group = a.ID_Disease_Group).defaultifempty
        From RFC In tbl_Reason_For_Calls.Where(Function(a) items.ID_Reason_For_Call = a.ID_Reason_For_Call).defaultifempty
        From Phys In tbl_Physicians.Where(Function(a) items.ID_Physician = a.ID_Physician).defaultifempty
        From Title In tbl_Titles.Where(Function(a) Phys.ID_Title = a.ID_Title).defaultifempty
        Select
        items.ID_Demog,
        items.Last_Name, 
        items.First_Name,
        AKA_Name = demogAKA.Last_Name + ", " + demogAKA.First_Name,
        items.DOB,
        items.Gender,
        items.ST_Complete, 
        items.LT_Complete, 
        items.LT_Due_Date,
        DType.Disease_Type_Abr, 
        DGroup.Disease_Group_Name, 
        RFC.Reason_For_Call, 
        items.ID_Physician,
        Phys_Name = Phys.Last_Name + ", " + Phys.First_Name + ", " + Title.Title
        ).distinct

console.writeline(Query2)
这是一个组合框的当前查询,该组合框返回所有名称,即使字段为空,也会连接这些名称

Dim Phys = (From e In tbl_Physicians
           Group Join f In tbl_Titles On e.ID_Title Equals f.ID_Title
           Into Matched = Group
           From m In Matched.DefaultIfEmpty()
           Select e.ID_Physician,
                   e.Last_Name,
                   e.First_Name,
                   e.Middle_Initial,
                   m.Title
            ).ToArray().Select(Function(item) New With {
            .ID = item.ID_Physician,
            .Phys_Name = (String.Join(", ",
                String.Join(",",
                    New String() {item.Last_Name, item.First_Name, item.Title}).Split(
                    New Char() {","}, System.StringSplitOptions.RemoveEmptyEntries)))
            })

Console.writeline(Phys)
当我尝试添加第三个查询以仅返回医生的姓名,并将其连接到最终查询时,我得到以下错误: 除Contains运算符外,查询运算符的LINQ到SQL实现中不能使用局部序列

当我尝试将我的工作查询加入到最终查询中时,出现以下错误: 从“System.String”到“VB$AnonymousDelegate_0”2[[System.Object,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934]的强制转换无效


在LINQpad玩了很长时间之后,终于重新阅读了我的文章,我意识到我做错了什么

根据他的职位:

问题是,虽然LINQ通常对该代码没有问题,但LINQ到实体却有问题。LINQ语法对于每个提供程序都是相同的,但在后台的实现是不同的,在LINQ到实体的情况下,您的LINQ代码必须转换为SQL,在这种情况下,没有从String.Join到SQL的映射。该代码将有效k使用LINQ to Objects很好,因此一种解决方案是将该操作从原始查询中推出,并进入LINQ to Objects查询。这意味着使用LINQ to Entities查询选择原始数据,对结果调用ToList或ToArray以实现查询,然后对该结果执行另一个查询。第二个查询将是LINQ to对象,而不是LINQ到实体等字符串。连接将不是问题

所以…当我意识到我需要推出String.Join时,我得到了以下代码:

Dim DispList = (From items In MastList
From demogAKA In dbACL.data_Demog.Where(Function(a) items.ID_Demog = a.ID_Demog_AKA).DefaultIfEmpty
From DType In dbACL.tbl_Disease_Type.Where(Function(a) items.ID_Disease_Type = a.ID_Disease_Type).DefaultIfEmpty
From DGroup In dbACL.tbl_Disease_Group.Where(Function(a) items.ID_Disease_Group = a.ID_Disease_Group).DefaultIfEmpty
From RFC In dbACL.tbl_Reason_For_Call.Where(Function(a) items.ID_Reason_For_Call = a.ID_Reason_For_Call).DefaultIfEmpty
From e In dbACL.tbl_Physician.Where(Function(a) items.ID_Physician = a.ID_Physician).DefaultIfEmpty
Group Join f In dbACL.tbl_Title On e.ID_Title Equals f.ID_Title
    Into Matched = Group
From m In Matched.DefaultIfEmpty()
Select
    items.ID_Demog,
    items.Last_Name,
    items.First_Name,
    AKALname = demogAKA.Last_Name,
    AKAFname = demogAKA.First_Name,
    items.DOB,
    items.Gender,
    items.ST_Complete,
    items.LT_Complete,
    items.LT_Due_Date,
    DType.Disease_Type_Abr,
    DGroup.Disease_Group_Name,
    RFC.Reason_For_Call,
    items.ID_Physician,
    PLName = e.Last_Name,
    PFname = e.First_Name,
    PMI = e.Middle_Initial,
    PTitle = m.Title
).Distinct.ToList().Select(Function(a) New With {
    a.ID_Demog,
    a.Last_Name,
    a.First_Name,
    .AKA_Name = (String.Join(", ",
        String.Join(",",
            New String() {a.AKALname, a.AKAFname}).Split(
            New Char() {","}, System.StringSplitOptions.RemoveEmptyEntries))),
    a.DOB,
    a.Gender,
    a.ST_Complete,
    a.LT_Complete,
    a.LT_Due_Date,
    a.Disease_Type_Abr,
    a.Disease_Group_Name,
    a.Reason_For_Call,
    a.ID_Physician,
    .PName = (String.Join(", ",
        String.Join(",",
            New String() {a.PLName, a.PFname, a.PTitle}).Split(
            New Char() {","}, System.StringSplitOptions.RemoveEmptyEntries)))
    }).ToList()
'Query1 removed to save space
Dim query2 = (From items In query1
        From demogAKA In data_Demogs.Where(Function(a) items.ID_Demog = a.ID_Demog_AKA).defaultifempty
        From DType In tbl_Disease_Types.Where(Function(a) items.ID_Disease_Type = a.ID_Disease_Type).defaultifempty
        From DGroup In tbl_Disease_Groups.Where(Function(a) items.ID_Disease_Group = a.ID_Disease_Group).defaultifempty
        From RFC In tbl_Reason_For_Calls.Where(Function(a) items.ID_Reason_For_Call = a.ID_Reason_For_Call).defaultifempty
        From Phys In tbl_Physicians
            Where items.ID_Physician = Phys.ID_Physician
            Group Join f In tbl_Titles On Phys.ID_Title Equals f.ID_Title
            Into Matched = Group
            From m In Matched.DefaultIfEmpty()
        Select
        items.ID_Demog,
        items.Last_Name, 
        items.First_Name,
        AKA_Name = demogAKA.Last_Name + ", " + demogAKA.First_Name,
        items.DOB,
        items.Gender,
        items.ST_Complete, 
        items.LT_Complete, 
        items.LT_Due_Date,
        DType.Disease_Type_Abr, 
        DGroup.Disease_Group_Name, 
        RFC.Reason_For_Call, 
        items.ID_Physician,
        PhysName = Function(a) String.Join(", ",
                String.Join(",",
                    New String() {Phys.Last_Name, Phys.First_Name, m.Title}).Split(
                    New Char() {","}, System.StringSplitOptions.RemoveEmptyEntries))
        ).distinct

console.writeline(Query2)
Dim DispList = (From items In MastList
From demogAKA In dbACL.data_Demog.Where(Function(a) items.ID_Demog = a.ID_Demog_AKA).DefaultIfEmpty
From DType In dbACL.tbl_Disease_Type.Where(Function(a) items.ID_Disease_Type = a.ID_Disease_Type).DefaultIfEmpty
From DGroup In dbACL.tbl_Disease_Group.Where(Function(a) items.ID_Disease_Group = a.ID_Disease_Group).DefaultIfEmpty
From RFC In dbACL.tbl_Reason_For_Call.Where(Function(a) items.ID_Reason_For_Call = a.ID_Reason_For_Call).DefaultIfEmpty
From e In dbACL.tbl_Physician.Where(Function(a) items.ID_Physician = a.ID_Physician).DefaultIfEmpty
Group Join f In dbACL.tbl_Title On e.ID_Title Equals f.ID_Title
    Into Matched = Group
From m In Matched.DefaultIfEmpty()
Select
    items.ID_Demog,
    items.Last_Name,
    items.First_Name,
    AKALname = demogAKA.Last_Name,
    AKAFname = demogAKA.First_Name,
    items.DOB,
    items.Gender,
    items.ST_Complete,
    items.LT_Complete,
    items.LT_Due_Date,
    DType.Disease_Type_Abr,
    DGroup.Disease_Group_Name,
    RFC.Reason_For_Call,
    items.ID_Physician,
    PLName = e.Last_Name,
    PFname = e.First_Name,
    PMI = e.Middle_Initial,
    PTitle = m.Title
).Distinct.ToList().Select(Function(a) New With {
    a.ID_Demog,
    a.Last_Name,
    a.First_Name,
    .AKA_Name = (String.Join(", ",
        String.Join(",",
            New String() {a.AKALname, a.AKAFname}).Split(
            New Char() {","}, System.StringSplitOptions.RemoveEmptyEntries))),
    a.DOB,
    a.Gender,
    a.ST_Complete,
    a.LT_Complete,
    a.LT_Due_Date,
    a.Disease_Type_Abr,
    a.Disease_Group_Name,
    a.Reason_For_Call,
    a.ID_Physician,
    .PName = (String.Join(", ",
        String.Join(",",
            New String() {a.PLName, a.PFname, a.PTitle}).Split(
            New Char() {","}, System.StringSplitOptions.RemoveEmptyEntries)))
    }).ToList()