Ассоциация в Linq To SQL показывается как EntitySet <>, почему? - PullRequest
1 голос
/ 28 апреля 2010

У меня много проблем с созданием эквивалента Linq этой устаревшей хранимой процедуры. Самым большим препятствием является , похоже, он не хочет, чтобы я добавил второе «предложение» к соединению с tblAddress. Я получаю ошибку Cannot resolve method.... , что tblBusiness.tblAddress рассматривается как EntitySet<tblAddress> См. Внизу для текущих усилий.

Кто-нибудь может указать, что я делаю неправильно? Ниже, first , SPROC, который мне нужно конвертировать, и second , моя 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, чтобы воспользоваться советом Крейга ниже. Это почти работает. Теперь я получаю Cannot resolve symbol на a.AddressTypeID. Странно то, что Intellisense говорит мне, что tblAddress - это EntitySet<tblAdress>. Я пропускаю ассоциацию или у меня неправильная ассоциация, или я просто СЛИШКОМ много уровней?

Мысли

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

Обычно неправильно (и слишком много работы) использовать join в 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()
                        };
1 голос
/ 28 апреля 2010

Я не знаю, будет ли это делать все, что вам нужно, но вы можете использовать анонимные типы для эквивалентностей с составным ключом:

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

Посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...