LINQ To SQL Странный вопрос присоединения - PullRequest
0 голосов
/ 21 ноября 2008

У меня есть простая база данных с двумя таблицами. Пользователи и конфигурации. У пользователя есть внешний ключ, чтобы связать его с определенной конфигурацией.

У меня странная проблема, когда следующий запрос всегда вызывает внутреннее соединение с таблицей конфигурации независимо от значения второго параметра. Насколько я могу судить, хотя часть инициализации объекта «UserConfiguration =» является условной, LINQ этого не видит и определяет, что в любом случае соблюдается отношение.

Если я на самом деле удаляю эту последнюю инициализацию, все работает как положено. Это не внутреннее соединение, когда loadConfiguration == false, и это действительно, когда loadConfiguration == true.

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

public UserAccount GetByUsername(string username, bool loadConfiguration)
{
    using (Database database = new Database())
    {
        if (loadConfiguration)
        {
            DataLoadOptions loadOptions = new DataLoadOptions();
            loadOptions.LoadWith<User>(c => c.Configuration);
            database.LoadOptions = loadOptions;
        }

        return (from c in database.Users
                where c.Username == username
                select new UserAccount
                {
                    ID = c.ID,
                    ConfigurationID = c.ConfigurationID,
                    Username = c.Username,
                    Password = c.Password.ToArray(),
                    HashSalt = c.HashSalt,
                    FirstName = c.FirstName,
                    LastName = c.LastName,
                    EmailAddress = c.EmailAddress,

                    UserConfiguration = (loadConfiguration) ? new ApplicationConfiguration
                    {
                        ID = c.Configuration.ID,
                        MonthlyAccountPrice = c.Configuration.MonthlyAccountPrice,
                        TrialAccountDays = c.Configuration.TrialAccountDays,
                        VAT = c.Configuration.VAT,
                        DateCreated = c.Configuration.DateCreated

                    } : null

                }).Single();
    }
}

Заранее спасибо,

Martin.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2008

Нет, это не будет работать. Я сталкивался с подобными проблемами много раз. Причина этого связана с выражениями во время компиляции и условиями во время выполнения.

Вы можете сделать 2 запроса или, если вы не против присоединиться к конфигурации, независимо от параметра loadConfiguration, вы можете использовать:

var q = (from c in database.Users
                where c.Username == username
                select c).Single();

и затем использовать Linq-to-Objects для результата.

0 голосов
/ 21 ноября 2008

Замените .Single () на SingleOrDefault (), и Linq переключится на левое внешнее соединение. Я не знаю, будет ли это в вашем случае, но в некоторых случаях это так.

Отредактируйте dint. См. Single был для всего запроса, а не для части конфигурации:

попробуйте это:

     UserConfiguration = (loadConfiguration && c.Configuration != null) ? new ApplicationConfiguration
     {
          ID = c.Configuration.ID,
          MonthlyAccountPrice = c.Configuration.MonthlyAccountPrice,
          TrialAccountDays = c.Configuration.TrialAccountDays,
          VAT = c.Configuration.VAT,
          DateCreated = c.Configuration.DateCreated
      } : null
0 голосов
/ 21 ноября 2008

Не думаю, что так будет.

Я предлагаю разделить его на 2 разных запроса.

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

...