簡體   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