【问题标题】:Association in Linq To SQL showing as an EntitySet<>, why?Linq To SQL 中的关联显示为 EntitySet<>,为什么?
【发布时间】:2010-04-28 17:15:26
【问题描述】:

我在想出与这个遗留存储过程等效的 Linq 时遇到了很多麻烦。最大的障碍是 ,它似乎不想让我在与tblAddress 的连接上添加第二个“子句”。我收到了 Cannot resolve method... 错误。 tblBusiness.tblAddress 被视为 EntitySet&lt;tblAddress&gt; 请参阅底部以了解当前的工作。

谁能指出我做错了什么?下面是,first,我需要转换的 SPROCsecond,到目前为止我的 LINQ 尝试; 完全失败!

谢谢

SELECT dbo.tblPersonInsuranceCoverage.PersonInsuranceCoverageID, 
    dbo.tblPersonInsuranceCoverage.EffectiveDate, 
    dbo.tblPersonInsuranceCoverage.ExpirationDate, 
    dbo.tblPersonInsuranceCoverage.Priority, 
    dbo.tblAdminInsuranceCompanyType.TypeName AS CoverageCategory, 
    dbo.tblBusiness.BusinessName, 
    dbo.tblAdminInsuranceType.TypeName AS TypeName,
    CASE WHEN dbo.tblAddress.AddressLine1 IS NULL THEN '' ELSE dbo.tblAddress.AddressLine1 END 
    + ' ' + 
    CASE WHEN dbo.tblAddress.CityName IS NULL THEN '' ELSE '<BR>' + dbo.tblAddress.CityName END 
    + ' ' + 
    CASE WHEN dbo.tblAddress.StateID IS NULL THEN '' 
         WHEN dbo.tblAddress.StateID = 'ns' THEN '' 
         ELSE dbo.tblAddress.StateID END AS Address
FROM      
    dbo.tblPersonInsuranceCoverage 
        LEFT OUTER JOIN dbo.tblInsuranceCompany 
            ON dbo.tblPersonInsuranceCoverage.InsuranceCompanyID = dbo.tblInsuranceCompany.InsuranceCompanyID 
                LEFT OUTER JOIN dbo.tblBusiness     
                    ON dbo.tblBusiness.BusinessID = dbo.tblInsuranceCompany.BusinessID 
                        LEFT OUTER JOIN dbo.tblAddress 
                            ON dbo.tblAddress.BusinessID = dbo.tblBusiness.BusinessID and tblAddress.AddressTypeID = 'b' 

        LEFT OUTER JOIN dbo.tblAdminInsuranceCompanyType 
            ON dbo.tblPersonInsuranceCoverage.InsuranceCompanyTypeID = dbo.tblAdminInsuranceCompanyType.InsuranceCompanyTypeID  

        LEFT OUTER JOIN dbo.tblAdminInsuranceType 
            ON dbo.tblPersonInsuranceCoverage.InsuranceTypeID = dbo.tblAdminInsuranceType.InsuranceTypeID   

WHERE tblPersonInsuranceCoverage.PersonID = @PersonID

 var coverage = 
                    from insuranceCoverage in context.tblPersonInsuranceCoverages
                    where insuranceCoverage.PersonID == personID

                select
                    new
                        {
                            insuranceCoverage.PersonInsuranceCoverageID,
                            insuranceCoverage.EffectiveDate,
                            insuranceCoverage.ExpirationDate,
                            insuranceCoverage.Priority,
                            CoverageCategory = insuranceCoverage.tblInsuranceCompany.tblAdminInsuranceCompanyType.TypeName,
                            insuranceCoverage.tblInsuranceCompany.tblBusiness.BusinessName,
                            TypeName = insuranceCoverage.InsuranceTypeID,
                            Address = insuranceCoverage.tblInsuranceCompany.tblBusiness.tblAddresses
                                                                        .Where(a => a.AddressTypeId = 'b')
                                                                        .FirstOrDefault()
                            };

为进一步尝试编辑

所以我在 dbml 中添加了一些关联,以便我可以在下面接受 Craigs 的建议。它几乎可以工作。现在我在a.AddressTypeID 上收到Cannot resolve symbol。奇怪的是,Intellisense 告诉我tblAddressEntitySet&lt;tblAdress&gt;。我错过了一个关联,还是我有一个不合适的关联,或者我的层次太深了?

想法?

【问题讨论】:

    标签: c# .net linq linq-to-sql stored-procedures


    【解决方案1】:

    It's usually wrong (and way too much work) to use join in LINQ to SQL。相反,请使用 L2S 为您生成的导航/关联属性:

    var coverage = 
                    from insuranceCoverage in context.tblPersonInsuranceCoverages
                    where insuranceCoverage.PersonID == personID
                    select new
                        {
                                insuranceCoverage.PersonInsuranceCoverageID,
                                insuranceCoverage.EffectiveDate,
                                insuranceCoverage.ExpirationDate,
                                insuranceCoverage.Priority,
                                CoverageCategory = insuranceCoverage.insuranceCompany.tblAdminInsuranceCompanyType.TypeName,
                                insuranceCoverage.insuranceCompany.tblBusiness.BusinessName,
                                TypeName = insuranceCoverage.InsuranceTypeID,
                                Address = insuranceCoverage.insuranceCompany.Addresses
                                                                            .Where(a => a.AddressTypeID == 'b')
                                                                            .FirstOrDefault()
                            };
    

    【讨论】:

    • 我同意,不幸的是我没有在 Intellisense 中获得该选项....我想知道为什么...
    • 好的,我进入dbml 并添加了一些associations。我不知道为什么它们不是 ALL 自动生成的,但我离题了。之后,我能够按照您对 ADDRESS 部分的建议 EXCEPT 进行操作。有关更多详细信息,请参阅我的编辑。谢谢!
    • 当您输入a. 时,IntelliSense 会显示什么?您可能需要执行类似a.AddressType.Id 的操作(请注意额外的点)。
    • 没关系,我是个白痴。它应该是a.AddressTypeID == 'b' 注意大写D 和第二个= 哇!无论如何,谢谢你的帮助。
    【解决方案2】:

    我不知道它是否能满足您的所有需求,但您可以使用匿名类型和复合键进行等值连接:

     from x in table1
     join y in table2 on new { x.Id1, x.Id2 } equals new { y.Id1, y.Id2 }
     ...
    

    看看有没有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多