我试图在Linq-To-CRM中动态过滤查询结果。
基本上我有一个标准查询,根据某些标准,我希望能够为此添加某些过滤器。但是我收到了这个错误...... 方法'其中'不能按照方法选择'或不受支持。尝试根据支持的方法编写查询,或者调用“AsEnumerable”' AsEnumerable'或者' ToList'调用不支持的方法之前的方法。
我的代码的简化示例如下所示。有人知道这是否可以使用linq-to-sql完成? 我可能有5个或6个单独的过滤器,我可能需要或不必动态添加。我当然可以为过滤器的所有可能组合定义单独的查询,但这看起来像是矫枉过正。如果可能的话,我想避免这种情况。
IQueryable<CourseProduct> coursesVar =
(
from a in context.CreateQuery("vs_course")
join b in context.CreateQuery("product") on a["vs_product"] equals b["productid"]
join c in context.CreateQuery("productpricelevel") on b["productid"] equals c["productid"]
join d in context.CreateQuery("vs_coursetype") on a["vs_coursetype"] equals d["vs_coursetypeid"]
join e in context.CreateQuery("vs_coursearea") on a["vs_coursearea"] equals e["vs_courseareaid"]
where a["vs_product"] != null // ensure product is set
&& a["vs_coursetype"] != null
&& a["vs_coursearea"] != null
&& a["vs_price"] != null
where b["price"] != null
where c["pricelevelid"] != null
&& (Guid)c["pricelevelid"] == pricelistId // ensure price list is set (and matches the correct pricelist)
&& c["amount"] != null
select new CourseProduct
{
CourseId = (Guid)a["vs_courseid"],
CourseCode = !a.Contains("vs_code") ? string.Empty : (string)a["vs_code"],
CourseName = !a.Contains("vs_name") ? string.Empty : (string)a["vs_name"],
CourseType = !a.Contains("vs_coursetype") ? string.Empty : ((EntityReference)a["vs_coursetype"]).Name,
CoursePrice = !a.Contains("vs_price") ? -997 : ((Money)a["vs_price"]).Value,
ProductPrice = !b.Contains("price") ? -996 : ((Money)b["price"]).Value,
PricelistItemPrice = !c.Contains("amount") ? -995 : ((Money)c["amount"]).Value,
CurrencySymbol = currencySymbol,
ActualType = !d.Contains("vs_type") ? -999 : ((OptionSetValue)d["vs_type"]).Value,
CourseTypeId = (Guid)d["vs_coursetypeid"],
CourseAreaId = (Guid)e["vs_courseareaid"],
CourseTypeCode = !d.Contains("vs_code") ? string.Empty : (string)d["vs_code"],
CourseAreaCode = !e.Contains("vs_code") ? string.Empty : (string)e["vs_code"]
}
);
// now try and add some filters dynamically
coursesVar = coursesVar.Where(i => i.CourseCode == "X");
coursesVar = coursesVar.Where(i => i.CourseAreaCode == "Y");
var finalList = coursesVar.ToList(); // this line throws the error
答案 0 :(得分:0)
有理由不支持它。否则linq-2-sql必须非常聪明,它可以使用额外的过滤器将select new {}
中的整个代码转换回SQL并在数据库中执行。那将是一个杀手级的特征......
所以你应该在选择新的{}
之前添加你的位置像
这样的东西from a in context.CreateQuery("vs_course")
<and the rest of your complex join>
重做首先做过滤器
// now try and add some filters dynamically
coursesVar = coursesVar.Where(|rephrase in terms of the Original query|}
最后
Select new
这显然有一个缺点,即“清洁”。需要在原始查询样式中更多地表达动态过滤器的代码。
替代方法是在添加过滤器之前实现。这取决于过滤器之前/之后返回的行数之间的比例。