0

oDataサービスのメソッドを作成する場合、以下のlinqがあり、結果をフィルター処理するための動的な「where」句が必要です(結合の「new」はエンティティデータモデルの複合PK用です)。

var query = from pl in CurrentDataSource.ProductListing
             join pla in CurrentDataSource.ProductListingAttribute
                 on new {pl.ProductID, pl.WebCategoryID, pl.ParentProductID}
                 equals new {pla.ProductID, pla.WebCategoryID, pla.ParentProductID}
             join att in CurrentDataSource.Attribute
                 on pla.AttributeID
                 equals att.AttributeID
             join attItem in CurrentDataSource.AttributeItem
                 on pla.AttributeItemID
                 equals attItem.AttributeItemID
             select pl;

私のLinqはあまり良くなく、DynamicQueryableクラスを使用して、実行時に「where」句を生成しようとしています(さまざまな変数から構築されています)。

var returnData = query.Where(whereClause);

「where」句はAttributeエンティティとAttributeItemエンティティの値をフィルタリングするため、常に次のようなものが含まれます。

"((Attribute.Value='foo' AND AttributeItem.Value='bar') 
OR 
(Attribute.Value='sna' AND AttributeItem.Value='fu'))"

「タイプ'ProductListing'にプロパティまたはフィールド'Attribute'が存在しない」ため、実行時に失敗します。

ProductListingエンティティのすべての要素と、フィルタリングする必要のあるAttributeおよびAttributeItemの要素を含む匿名型を「select」に作成しようとしましたが、メソッドから戻るには、「ProductListing」型の強く型付けされたエンティティが必要です。電話。

誰か助けてもらえますか?動的な場所の代わりに動的な結合を使用する必要がありますか?選択していないエンティティに対してWhere-ingする方法はありますか?匿名タイプ/"let"を選択し、後で強いタイプのエンティティを構築する必要がありますか?

どうぞ、どんな助けでも大歓迎です。

rposbo

4

1 に答える 1

0

私の特定のクエリに対する解決策は、これを行うことでした:

            var query = from pl in CurrentDataSource.ProductListing
                             join pla in CurrentDataSource.ProductListingAttribute
                                 on new {pl.ProductID, pl.WebCategoryID, pl.ParentProductID}
                                 equals new {pla.ProductID, pla.WebCategoryID, pla.ParentProductID}
                             join att in CurrentDataSource.Attribute
                                 on pla.AttributeID
                                 equals att.AttributeID
                             join attItem in CurrentDataSource.AttributeItem
                                 on pla.AttributeItemID
                                 equals attItem.AttributeItemID
                        select new
                        {
                            ProductListing = pl,
                            att.AttributeName,
                            attItem.AttributeValue
                        };

            var returnData = query.Where(whereClause).Select(o => o.ProductListing);

つまり、具象型を含む匿名型を選択し、そこに where 句を適用してから、結果から具象型のみを選択します。

于 2010-09-28T11:12:00.860 に答える