2

linq to sql を使用して 3 つの ef オブジェクトのクエリを強く入力しようとしています。製品とカテゴリには 1 対多の関係があります。私のクラスにはナビゲーション プロパティが含まれており、次のようになります。

public partial class Product
{

public int ID {get;set;}
public string Name {get;set;}
public virtual ICollection<Group> NpGroup {get;set;}
}

public partial class Category
{
public int ID {get;set;}
public string Name {get;set;}
public virtual ICollection<Group> NpGroup {get;set;}
}

public partial class Group
{
public int ID {get;set;}
public int ProductID {get;set;}
public int CategoryID {get;set;}
public virtual Product NpProduct {get;set;}
public virtual Category NpCategory {get;set;}
}

文字列ベースの .Include() を回避しようとすると、ProductID "1" に等しいグループを返すだけでなく、製品とカテゴリの名前も含むクエリを作成するにはどうすればよいですか?

何かのようなもの:

var context = ObjectContext.CurrentObjectContext;
    var query = from c in context.Group
    where c.ProductID == 1
    //Include the names of the product and category of the group record (c.NpProduct.Name etc.)
    select c;

私はおそらく森の中の木を見逃していますが、ObjectContext.LoadProperty の構文を取得できないようです (それが正しい方法である場合)。

何かご意見は?ありがとう。

4

2 に答える 2

0

まず第一に、L2SQL と EF の両方を使用しているとは思えないので、混乱しないようにしてください。

とにかく、EF を使用すると、ナビゲーション プロパティを読み込む方法が 2 つあります。

1 - 一括読み込み

q.Include("NavPropertyName")

2 - 明示的なロード

*After* running your above query - use q.NavPropertyName.Load()

違いは、オプション 2) が 2 つのクエリを引き起こし、オプション 1 が FK で内部結合を引き起こすことです。

「魔法の文字列」のためにインクルードを使用することに消極的であることに同情できます-EFチームがそれらを強く型付けしなかった理由はわかりませんが、正当な理由があったことは確かです.

ロード/インクルードの詳細については、こちらを参照してください。

HTH

于 2010-10-04T21:19:08.467 に答える
0

.include() ステートメントで型指定された文字列を使用することは誰もが嫌だと思います。

スペルミスなどを避けるために、テーブル名を表すために列挙型を使い始めました。

約 70 個のテーブルのデータベースの場合、10 分かかりました。列挙型を作成すると、私のlinqは次のようになります。

var context = ObjectContext.CurrentObjectContext; var query = from c in context.Group.Include(TableEnum.Category.ToString()) where c.ProductID == 1 select c;

繰り返しますが、完璧ではありませんが、少なくともコンパイラによってチェックされています

于 2010-10-05T07:49:25.557 に答える