实体数据模型,动态Linq,多表动态Where子句,强类型返回类型

时间:2010-09-28 08:48:39

标签: c# linq-to-entities anonymous-types dynamic-linq

当为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

1 个答案:

答案 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子句应用于该子句,然后从结果中仅选择具体类型。