#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.
});