oDataサービスのメソッドを作成するとき、以下のlinqがあり、結果をフィルター処理するための動的な "where"句が必要です(結合の "新しい"は、エンティティデータモデルの複合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」型の強く型付けされたエンティティが必要ですコール。
誰でも手伝ってくれる??動的Wheresではなく動的結合を使用する必要がありますか?選択していないエンティティに対してWhere-ingを行う方法はありますか?匿名タイプ/ "let"を選択し、後で強く型付けされたエンティティを構築する必要がありますか?
どんな助けでも大歓迎です。
rposbo
私の特定のクエリに対する解決策はこれを行うことでした:
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句を適用して、結果から具象型のみを選択します。