我想在多列上实现一个过滤器,但我不想为每个列都写一个新的查询 。所以,我实现了一个GetDistinctProperty功能,看起来像这样:具有多个选择值的动态Linq查询
public ActionResult GetDistinctProperty(string propertyName)
{
var selector = CreateExpression<TDomain>(propertyName);
var query = this.InventoryService.GetAll(Deal);
var results = query.Select(selector).Distinct().ToList();
return Json(results, JsonRequestBehavior.AllowGet);
}
private static Expression<Func<T, object>> CreateExpression<T>(string propertyName)
{
// Specify the type we are accessing the member from
var param = Expression.Parameter(typeof(T), "x");
Expression body = param;
// Loop through members in specified property name
foreach (var member in propertyName.Split('.'))
{
// Access each individual property
body = Expression.Property(body, member);
}
var conversion = Expression.Convert(body, typeof(object));
// Create a lambda of this MemberExpression
return Expression.Lambda<Func<T, object>>(conversion, param);
}
让我们为例子,我有作为propertyName的SiteIdentifier。
的选择给了我作为价值
{x => Convert(x.SiteIdentifier)}
,当我想看到的结果它给了我下面的错误:
Unable to cast the type 'System.String' to type 'System.Object'.
LINQ to Entities only supports casting EDM primitive or enumeration types.
当我尝试选择如下:
var results = query.Select(x=>x.SiteIdentifier).Distinct().ToList();
它的工作原理。
任何任何想法?
这不是一个有效的语法:'{X =>转换(x.SiteIdentifier)}'除非你有一个名为'Convert'函数接受单个参数。 – user3185569
不,我知道,这是CreateExpression(propertyName)的结果;我希望它像这样x => x。SiteIdentifier –
Walter
如何让'propertyName'传递给'GetDistinctProperty'方法? –