0

2 つのテーブルを持つ単純なデータベースがあります。ユーザーと構成。ユーザーは、特定の構成にリンクするための外部キーを持っています。

次のクエリでは、2 番目のパラメーター値に関係なく、構成テーブルへの内部結合が常に発生するという奇妙な問題が発生しています。私が知る限り、オブジェクトの初期化の "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();
    }
}

前もって感謝します、

マーティン。

4

3 に答える 3

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 は左外部結合に切り替わります。あなたのケースでそれができるかどうかはわかりませんが、場合によってはそうです。

Edit dint's see 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 に答える
0

私はそれがそのように機能するとは思わない。

2 つの異なるクエリに分割することをお勧めします。

おそらくもっと良い方法がありますが、より多くの「配管」が必要になります。

于 2008-11-21T12:37:50.633 に答える