Преобразование SQL в LINQ

#asp.net #linq #linq-to-entities

#asp.net #linq #привязка к сущностям

Вопрос:

У меня есть следующий SQL. Мне нужно преобразовать его в LINQ.

 ALTER VIEW [dbo].[vwRptBorrowerAccount]  
AS  
SELECT dbo.tblAccount.[Creditor Registry ID], dbo.tblAccount.[Account No], dbo.tblAccount.[Date Opened], dbo.tblAccount.[Account Status ID],   
               dbo.tblAccount.[Date First Reported], dbo.tblAccount.[Credit Limit], dbo.tblAccount.Balance, dbo.tblAccount.[Minimum Installment], dbo.tblAccount.[Account Type],   
               dbo.tblAccount.Term, dbo.tblAccount.Purpose, dbo.tblAccount.[Account Owner Notes], dbo.tblAccount.[Creditor Notes], dbo.tblAccount.Collateral,   
               dbo.tblAccount.[Collateral Value], dbo.tblAccount.[Legal Status ID], dbo.tblAccount.[Legal Status Date], dbo.tblAccount.LastUpdatedBy,   
               dbo.tblAccount.LastUpdated, dbo.tblAccount.[Unique ID], dbo.tblAccount.[Account Status Date], dbo.tblAccount.Payment, dbo.tblAccount.[Payment Date],   
               dbo.tblAccount.[Balance Date], dbo.tblAccount.[Term Frequency], dbo.tblAccount.[State Change Date],   
               dbo.fn_GetAccountTypeDescription(dbo.tblAccount.[Account Type]) AS [Account Type Description], dbo.tblBusiness.[Business Name] AS CreditorName,   
               dbo.tblBusiness.Address AS CreditorAddress, dbo.tblBusiness.City AS CreditorCity, dbo.tblBusiness.State AS CreditorState,   
               dbo.tblLegalStatus.[Legal Status Description] AS [Legal Status], dbo.tblAccountStatus.[Account Status Description] AS [Account Status],   
               dbo.tblAccountOwner.[Account Owner Registry ID]  
FROM  dbo.tblAccount INNER JOIN  
               dbo.tblAccountOwner ON dbo.tblAccount.[Creditor Registry ID] = dbo.tblAccountOwner.[Creditor Registry ID] AND   
               dbo.tblAccount.[Account No] = dbo.tblAccountOwner.[Account No] INNER JOIN  
               dbo.tblBusiness ON dbo.tblAccount.[Creditor Registry ID] = dbo.tblBusiness.[Registry ID] INNER JOIN  
               dbo.tblAccountStatus ON dbo.tblAccount.[Account Status ID] = dbo.tblAccountStatus.[Account Status ID] INNER JOIN  
               dbo.tblLegalStatus ON dbo.tblAccount.[Legal Status ID] = dbo.tblLegalStatus.[Legal Status ID]  
WHERE (dbo.tblAccount.[Account Type] NOT IN ('CA00', 'CA01', 'CA03', 'CA04', 'CA02', 'PA00', 'PA01', 'PA02', 'PA03', 'PA04')) 
  

[ОТРЕДАКТИРОВАНО]
и детали функции:

 CREATE FUNCTION [fn_GetAccountTypeDescription]  
(  
 -- Add the parameters for the function here  
 @accountType varchar(max)  
)  
RETURNS varchar(max)  
with schemabinding  
AS  
BEGIN  
 -- Declare the return variable here  
 DECLARE @Result varchar(max)  

 -- Add the T-SQL statements to compute the return value here  
 IF EXISTS(SELECT Abbreviation FROM dbo.tblAccountType WHERE [Account Type Code] = @accountType)  
 BEGIN  
  SELECT @Result = Abbreviation FROM dbo.tblAccountType WHERE [Account Type Code] = @accountType  
 END  
 ELSE  
 BEGIN  
  SELECT @Result = @accountType  
 END  

 -- Return the result of the function  
 RETURN @Result  

END
  

Не могли бы вы, пожалуйста, подсказать, как преобразовать его в LINQ? Я не хочу использовать объединения.

Комментарии:

1. Я хочу использовать ассоциации. Объекты связаны через связанные свойства.

2. Неудобным моментом будет fn_GetAccountTypeDescription

3. @Jodrell: Я обновил вопрос, чтобы показать fn_GetAccountTypeDescription

4. Для начала вы могли бы использовать приложения, предназначенные для выполнения подобных задач, такие как linqpad или linqer… sqltolinq.com

5. ПОЧЕМУ вы хотите преобразовать это в LINQ? Какие объекты вы пытаетесь создать из этого запроса? Если вы просто пытаетесь получить результаты запроса, нет смысла использовать ORM — на самом деле, это плохая идея делать это. Кстати, к чему привязан LINQ? LINQ в SQL? Сущности? NHibernate? Каждый ORM имеет свой собственный способ указать, что некоторые объекты должны загружаться одновременно, вместо того, чтобы загружать каждый объект по отдельности.

Ответ №1:

Я не думаю, что вы сможете сделать это без объединений, независимо от того, используете вы LINQ или нет.

Кроме того, это кажется довольно бесполезным упражнением. Какую выгоду вы ожидаете получить от времени, которое вы инвестируете в это?

Кроме того, вы не указали, какого поставщика LINQ вы собираетесь использовать, так что на ваш вопрос невозможно ответить (у каждого поставщика есть существенные различия в синтаксисе).

Комментарии:

1. У меня есть приложение, разработанное в asp.net и я конвертирую его в MVC3, используя LINQ и Entities Framework 4.1, и это часть этого. У меня нет данных в таблицах, поэтому я не могу проверить, правильно я это делаю или нет.

Ответ №2:

Хорошо, убедитесь, что вы добавили tblAccountType в свою модель и у него есть связь с tblAccount, затем сделайте что-нибудь, как показано ниже.

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

 String[] excludedCodes = new String[]
    {
        "CA00",
        "CA01",
        "CA03",
        "CA04",
        "CA02",
        "PA00",
        "PA01",
        "PA02",
        "PA03",
        "PA04"
    };

var data = context.tblAccount.Where(a => !excludedCodes.Contains(a.AccountType))
    .Select(a => new{
            a.Creditor_Registry_ID,
            a.Account_No,
            a.Date_Opened,
            ...
            Account_Type_Description = a.tblAccountType.Where
                (t => t.Account_Type_Code = a.Account_Type).SingleOrDefault() 
                   ??  a.Account_Type),
            Creditor_Name = a.tblBusiness.Business_Name,
            CreditorAddress = a.tblBusiness.Address,
            ...
            Legal_Status = a.tblLegalStatus.Legal_Status_Description,
            ... etc.
        });