当为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”类型中没有“属性或字段'属性'。”
我试图在“select”中构建一个匿名类型,它包含ProductListing实体的所有元素以及我需要过滤的Attribute和AttributeItem中的那些元素,但我需要一个类型为“ProductListing”的强类型实体来返回来自方法调用。
任何人都可以帮忙吗?我应该使用动态联接而不是动态Wheres吗?有没有一种方法可以解决您未选择的实体?我应该选择匿名类型/“let”并在之后构建强类型实体吗?
拜托,非常感谢任何帮助。
rposbo
答案 0 :(得分: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子句应用于该子句,然后从结果中仅选择具体类型。