繁体   English   中英

LINQ To SQL奇怪的联接问题

[英]LINQ To SQL Weird Join Issue

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

我遇到一个奇怪的问题,即无论第二个参数值如何,以下查询总是会导致内部联接到配置表。 据我所知,即使对象初始化的“ 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();
    }
}

提前致谢,

马丁

我不认为它会那样工作。

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

也许有更好的方法,但是这需要更多的“麻烦”。

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

您可以执行2个查询,或者如果不考虑加入配置而不考虑loadConfiguration参数,则可以使用:

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

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

用SingleOrDefault()替换.Single(),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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM