Возврат связанных объектов в select linq to sql - PullRequest
0 голосов
/ 06 марта 2009

У меня есть 2 таблицы Account и Address, которые имеют отношение 1: 1; В аккаунте есть адрес. Я создал ассоциацию в файле dbml. Теперь я хочу написать запрос для выбора учетной записи для данной учетной записи, и полученная учетная запись должна также содержать объект адреса.

 using (var context = new SalesLogixDataClassesDataContext())
        {
            var query = context.ACCOUNTs
                .Where(a => a.ACCOUNTID == id)
                .Select(a => new Account {AccountId = id, AccountName = a.ACCOUNT1, Address=a.ADDRESS});

            return query.FirstOrDefault();
        }

Но в возвращаемом объекте адрес нулевой. Итак, что мне нужно сделать в запросе, чтобы адрес объекта также был получен.

РЕДАКТИРОВАТЬ: Извините, ребята, что привели вас в погоню за дикой гуся. Я неправильно сопоставил ассоциацию (Address.AddressId как сопоставлен с Account.AccountId). Я исправил это, и теперь он работает нормально. Спасибо всем за помощь.

Ответы [ 2 ]

2 голосов
/ 06 марта 2009

Почему вы создаете новый объект Account в select, а не просто позволяете LINQ-> SQL его обрабатывать? Если вы позволяете платформе выбрать объект, она должна правильно установить EntityRef для свойства, и ассоциация должна работать.

using (var context = new SalesLogixDataClassesDataContext())
    {
        var query = context.ACCOUNTs
            .Where(a => a.ACCOUNTID == id);

        return query.FirstOrDefault();
    }

Просто Edit, если вы выбираете изменить имена свойств из сгенерированных имен, вы также можете сделать это через конструктор DBML, так что объект, который вы получаете, является дружественным, но сохраняет связь с таблицей через фактические имена столбцов.

После повторного просмотра вашего кода (извините, я неправильно прочитал настройку сущности), я удалил недействительный текст из исходного ответа.

Ниже приведен пример XML-кода о том, как вы можете сделать объекты вашей модели более дружественными, а не переводить их вручную в свои запросы.

<Table Name="dbo.ACCOUNT" Member="Accounts">
    <Type Name="Account">
      <Column Name="ACCOUNTID" Member="AccountId" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
      <Column Name="ACCOUNT1" Member="AccountName" Type="System.String" DbType="VarChar(...) NOT NULL" CanBeNull="false" />
      <Association Name="Address_Account" Member="Address" ThisKey="ThisTablesFKIDToAddress" OtherKey="AddressTablePKID" Type="Address" IsForeignKey="true" />
    </Type>
</Table>

Вы можете сделать это через конструктор, который будет намного проще, а также сделает работу с вашим адресным объектом более приятной.

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

Конечно, если бы вы изменили ваш смоделированный объект, код выбора выглядел бы так:

using (var context = new SalesLogixDataClassesDataContext())
{
    return context.Accounts.FirstOrDefault(account => account.AccountId == id);
}
0 голосов
/ 07 марта 2009

. Внимательно посмотрите на отношение объектов, которое вы настроили, особенно на задействованные ключи. Независимо от того, хотите ли вы использовать пользовательские объекты, запрос, который вы предоставили, даст вам связанный адрес, если отношения настроены правильно и данные находятся в БД.

Вот пример реальной конфигурации, где StateMaster имеет свойство CustomerMasters1 (очищается наименование:)

alt text

...