17

匿名型を使用せずにlinqtosqlを使用して特定の列をフェッチせず、返された各ファイルを個別に指定する方法はあります

SQLMetalを使用して、クエリされたデータの結果を入れるすべてのタイプを含むdbmlファイルを生成します。ただし、select列がlinqクエリに含まれている場合、結果はdbmlファイルで宣言されている型ではなく匿名型になります。特定のテーブルから1つを除くすべての列を選択したいのですが、関連するdbmlタイプで結果が返されます。

どんなアイデアでもありがたいです。

4

5 に答える 5

18

LINQ to SQLは、個々のプロパティの遅延読み込みをサポートしています。DBMLデザイナでは、列のプロパティでにDelay Loaded設定できます。true遅延ロードされた列は、最初のに含まれませんSELECT。オブジェクトのプロパティにアクセスしようとして、まだロードされていない場合は、別のSELECTステートメントが実行されて、DBからこの値が取得されます。

DBMLファイルを手動で編集する場合は、を設定し<Column IsDelayLoaded="true">ます。LINQ to SQLクラスを手動で記述している場合は、プロパティのバッキングフィールドを。のLink<T>代わりに宣言するのと同じくらい簡単ですT。例えば:

[Table]
public class Person
{
    private Link<string> _name;

    [Column(Storage = "_name")]
    public string Name
    {
        get { return _name.Value; }
        set { _name.Value = value; }
    }
}

ScottGuthrieによるこの投稿の「遅延/遅延読み込み」セクションも参照してください。


更新:上記の回答は、必要なときに列を引き続き使用できるようにする場合に適用されます。SELECT特に要求するか(を参照LoadOptions)、アクセスを試みない限り、sには含まれません。

列をまったく使用またはアクセスしたくない場合で、クラスプロパティとして使用したくない場合は、DBMLファイルから列を削除するというSerapthの回答を参照してください。その列の同時実行性チェックが失われるなどの影響を必ず理解してください。

于 2009-05-12T13:44:38.063 に答える
4

非常に怠惰な場合は、DBMLデザイナーを使用してテーブルをもう一度追加し、名前をMyTableWithOutColumnXに変更してから、返されたくないレコードを削除してみませんか?列名をハイライトして削除を押すだけです。

そのずさんな、しかしそれから、ある程度、レコードが時々現れるべきではないテーブルを持っていることもそうです。何よりも、それは簡単で、すべてDBMLで抽象化されているため、アクセスするテーブルを切り替える以外は、コードに影響を与えることはありません。よく名付けられているので、遠い将来にコードを保守している人にとっても意味があるかもしれません。

于 2009-05-12T14:00:56.970 に答える
1

SQLMetalを使用して列の遅延読み込みを有効にする方法の例については、このリンクを参照してください。

基本的に、XSLTを使用して、生成されたファイルを後処理し、列タイプをXからLink<X>(両方のタイプはSystem.Data.Linqnamesapceから)に変換します。

于 2011-05-06T09:25:38.013 に答える
1

ご意見ありがとうございます。私が決めた最後の解決策は、戻したい列を指定することですが、Linqステートメント内で必要なタイプの新しいオブジェクトでこれを行うには...例が役立つはずです!:

テーブルログには3つの列があります

  • LogID
  • DateLogged
  • SerializedData

しかし、私はDateLogged&Serializedデータのみが必要です。ただし、SQLMetalによって生成されたデータコンテナ内でこれを希望します

私は次のステートメントでこれを達成しました:


Dim q = From logItem In dc.Log Select New Log With {.LogID = logItem.LogID、.DateLogged = logItem.DateLogged}


それが他の誰かを助けることを願っています!

于 2009-05-12T14:54:05.007 に答える
0

LINQ to SQLが含める列を認識する方法は、クエリに対して投影する匿名タイプによるものです。ストレートプロジェクションはすべてを返すため、LINQtoSQLで列を除外する方法は他にないと思います。

于 2009-05-12T13:12:08.397 に答える