0

我有一个带有两个表的简单数据库。用户和配置。用户有一个外键将其链接到特定配置。

我有一个奇怪的问题,无论第二个参数值如何,以下查询总是会导致对配置表的内部联接。据我所知,即使对象初始化的“UserConfiguration =”部分是有条件的,LINQ 也看不到这一点,并确定在任何情况下都遵循关系。

如果我真的删除了最后一次初始化,整个事情就会按预期工作。当 loadConfiguration == false 时它不会内连接,而当 loadConfiguration == true 时它会加入。

有人对此有任何想法吗?这种语法是行不通的吗?我现在唯一的想法是将 return 包装在一个基本的 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();
    }
}

提前致谢,

马丁。

4

3 回答 3

0

我不认为它会那样工作。

我建议将其拆分为 2 个不同的查询。

可能有更好的方法,但它需要更多的“管道”。

于 2008-11-21T12:37:50.633 回答
0

不,这行不通。我多次遇到类似的问题。其原因与编译时的表达式与运行时的条件有关。

您可以进行 2 次查询,或者如果您不介意加入配置而不管 loadConfiguration 参数,您可以使用:

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

然后在结果上使用 Linq-to-Objects。

于 2008-11-21T12:50:32.263 回答
0

将 .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
于 2008-11-21T13:07:22.167 回答