0

Linq2sqlオブジェクトをコンストラクターでドメインオブジェクトに変換している間、Linq2sqlはTSQLを構築する方法を知らないようです。そのような:

from c in db.Companies
select new Company (c.ID, c.Name, c.Location).Where(x => x.Name =="Roy");

ただし、設定可能な属性を使用する場合は問題ありません。

from c in db.Companies
select new Company { ID = c.ID, Name = c.Name, Location = c.Location }.Where(x => x.Name =="Roy");

これらの属性を設定可能にしたくありません。どうすればこれを達成できますか?そして、linq 2 sql がどのように TSQL に変換されるかについて、誰かが考える材料を提供できますか? 前もって感謝します!

4

3 に答える 3

1

おそらく、L2S が式を解析する方法に関係しています。オブジェクト初期化子の式は解析できますが、コンストラクターの式は解析できません。基本的に、L2S が機能する方法は、LINQ プロバイダーが行う方法で linq 式を解析し、結果を SQL に変換することです。

最初に IEnumerable に変換することで、目的を達成できます。そうすれば、LINQ to Objects を自由に使用できるようになります。あなたが与えた例では、これは些細なことですが、より複雑な where 節を持つケースに一般化しましょう:

var companyData =
    from c in db.Companies
    where c.Name.StartsWith("Roy")
    select new { c.ID, c.Name, c.Location };

var companies =
    from c in companyData.AsEnumerable()
    select new Company(c.ID, c.Name, c.Location);
于 2009-09-09T06:01:29.957 に答える
0

コンストラクターが何をするのかわからないため、コンストラクターを含むクエリを変換できません。プロパティのフィールドマッピングがありますが、コンストラクターは絶対に何でもできます-なぜそれを二番目に推測しようとする必要があるのでしょうか?

とにかく、プロパティを読み取り専用にする目的がL2Sエンティティクラスの目的であるかどうかは明確ではありません。オブジェクトを削除し、同じ主キーで新しいプロパティ値を使用して新しいオブジェクトを再作成することで、簡単に回避できます。

于 2009-09-09T06:46:48.460 に答える
0

from ステートメントは企業エンティティのコレクションを返すため、最初のクエリは正しくありません。1 つの会社のみを取得するには、最初のステートメントを次のように変更する必要があります。

Company c = (from c in db.Companies where c.ID = someId select c).First();

2 番目のステートメントは、where ステートメントを暗黙的に実行します。

2 番目のクエリの実行中にSQL プロファイラを実行して、TSQL ステートメントとして実際に使用されているものを確認することをお勧めします。

于 2009-09-09T03:27:44.517 に答える