2011-12-05 11 views
1

LinqToSql(またはEF)クエリから複数のエンティティを返すことができます(クエリはメソッド内にあります)。このようなLinqToSQL(またはEF)から複数のエンティティを返す

何か:

public IQueryable<KeyValuePair<Customer, Product>> GetCustomerEntities() 
{ 
    return 
    (
     from customer in this.Context.Customers 
       join 
       product in this.Context.Products on customer.ID equals product.CustomerID  
     select new KeyValuePair<Customer, Product>(customer, product) 
    ); 
} 

は、その後、私は次のようにさらにクエリを作成するために、このメソッドの結果を使用したい:

this.GetCustomerEntities().Where(e => e.Key.Name == "my customer") 

コンパイル上記の方法を、それが実行できませんLinqToSqlによって、KeyValuePairをSQLに変換できないため、期待される動作です。

これは何とかできますか?

答えて

1

ここで問題となるのは、customerをコンストラクタパラメータに渡すことは、明らかに同じではないので、e.Keyを見るのと同じことです。あなたはすなわち

select new CustomerProduct { Customer = customer, Product = product } 

ゲッターとセッターを使用して独自のPOCO型を作成し、その代わりにKeyValuePair<Customer,Product>を使用してみてください。

1つのメソッドの中で、匿名型が明らかです。

+0

ありがとうございます!まず、SQLを実行せずにクエリを作成することができます。 – SzilardD

0
this.GetCustomerEntities().ToList().Where(e => e.Key.Name == "my customer") 

これでうまくいくはずです。それは可能な最も効率的なものではありませんが、少なくともそれは実行されます。 ToList()を使用して列挙すると、SQLサーバー上でクエリ可能オブジェクトが実行され、それ以降の操作はメモリ内の列挙になります。これにより、KeyValuePairクラスを自由に使用することができます。

特にSQLを利用するためにクエリを具体的に作成する場合は、関数をパラメータ化し、最初にデータベースから必要な行のみを取得する必要があります。

関連する問題