2011-11-08 19 views
2

私はユーザーのバスケットに格納されたproductIDを調べ、データベースから製品の詳細を検索する単純なforeachループを使用します。ループ内にIQueryableを追加する方法

私のコードからわかるように、私が現在持っているものは画面上の最後の項目を返します。変数はループ内で上書きされるためです。私はバスケットにのみ項目の製品の詳細を表示できるようにこれを連結することができるようにしたいと思います。

私はリピーターのProductIDだけをストアするような簡単な操作を行うことができますが、データベースを呼び出すにはonitemdataboundを使用しますが、可能な場合はデータベースを1つだけ呼び出したいと思います。

は現在、私は、次の(取り外し複合体の例から合流するが、この事項が許可すれば、私は知っている)持っている:あなたの助けのための

IQueryable productsInBasket = null; 
    foreach (var thisproduct in store.BasketItems) 
    { 
     productsInBasket = (from p in db.Products 
           where p.Active == true && p.ProductID == thisproduct.ProductID 
           select new 
           { 
            p.ProductID, 
            p.ProductName, 
            p.BriefDescription, 
            p.Details, 
            p.ProductCode, 
            p.Barcode, 
            p.Price 
           }); 
    } 

    BasketItems.DataSource = productsInBasket; 
    BasketItems.DataBind(); 

感謝を!

答えて

7

それは本当にあなたのように聞こえるのようなものとしますだけで正常に動作しJonの答えでは、

var productIds = store.BasketItems.Select(x => x.ProductID).ToList(); 
var query = from p in db.Products 
      where p.Active && productIds.Contains(p.ProductID) 
      select new 
      { 
       p.ProductID, 
       p.ProductName, 
       p.BriefDescription, 
       p.Details, 
       p.ProductCode, 
       p.Barcode, 
       p.Price 
      }; 
+0

こんにちは、ジョン、ありがとう。それは治療を働いた!私はこれまでのようなフィルタを行うことは決して考えなかったでしょう。知っておくと便利です:) –

0

を、あなたがそれにToListメソッド()を呼び出しているので、のIQueryableはしかし、IEnumerableをに変換されます。これにより、クエリが実行され、回答が取得されます。あなたの状況では、これはOKかもしれません。なぜなら、あなたはバスケット用の製品を検索したいし、製品の数がかなり少なくなるからです。

しかし、私は同じような状況に直面しています。そこで、メンバーの友人を検索したいのです。友人関係は、2人のメンバーがどちらのグループに属しているかによって異なります。少なくとも1つのグループを共有する場合、友人になります。したがって、あるメンバーのすべてのグループのすべてのメンバーシップを取得し、それらのグループからすべてのメンバーを取得する必要があります。

ToListのアプローチは私の場合は適用できません。これは、友人をさまざまな方法で処理するたびにクエリを実行するためです。私たちが共有できるものを見つける。データベースからすべてのメンバーを検索するのではなく、最後にクエリを実行して実行するだけで、パフォーマンスが低下します。

私の最初の試みは、私が所属するすべてのグループ(IQueryable)を取得し、リスト結果(IEnumerable)を初期化し、すべてのグループをループし、すべてのメンバーを結果に追加しますまだリストには載っていない。最後に、私のインターフェイスはIQueryableが返されるように強制したので、AsIQueryableでリストを返しました。

これは厄介なコードですが、少なくとも機能しました。私はリストにすべての共有メンバーを追加するので、その後、ちょうど私のポストの条件を満足するのIQueryableにリストを変換

var result = new List<Member>(); 
foreach (var group in GetGroupsForMember(member)) 
    result.AddRange(group.GroupMembers.Where(x => x.MemberId != member.Id && !result.Contains(x.Member)).Select(groupMember => groupMember.Member)); 
return result.AsQueryable(); 

しかし、これは、BADである:それはこのような何かを見ました。データベースから影響を受けるすべてのメンバーを検索します

ページネーションされたリストを想像してください - このリストから特定の範囲を選びたいだけです。これがIQueryableで行われた場合、ページングステートメントでクエリが完了します。これがIEnumerableで行われた場合、クエリは既に実行されており、すべての操作がメモリ内の結果に適用されます。

(気づいているかもしれませんが、エンティティのリレーション(GroupMember => Member)もまたナビゲートしています。これにより結合が増え、あらゆる種類の不快な状況がさらに発生する可能性があります。私も同様にこの動作を削除したい)。

ので、今夜は、私は別のラウンドを取って、私はこのようなデータを選択はるかに単純なアプローチ、になってしまった:

var groups = GetGroupsForMember(member); 
var groupMembers = GetGroupMembersForGroups(groups); 
var memberIds = groupMembers.Select(x => x.MemberId); 
var members = memberService.GetMembers(memberIds); 

2入手方法がIQueryableを尊重し、決してそれをリストに変換したり、他のIEnumerable。 3行目は、IEnumerableのLINQクエリのontopを実行するだけです。最後の行はメンバーIDを取得し、IQueryablesでのみ動作する別のサービスからすべてのメンバーを取得します。

これはおそらくパフォーマンス面では恐ろしいことですが、必要に応じて後でさらに最適化することができます。少なくとも、不要なデータのロードは避けてください。

私がここでひどく間違っているかどうか教えてください。

関連する問題