我需要将以下代码翻译成表达式,我将解释原因:
results = results.Where(answer => answer.Question.Wording.Contains(term));
结果是IQueryable< ISurveyAnswer>
问题是ISurveyQuestion
措辞是字符串
问题是,Question并不总是LINQ to SQL属性的名称。
这将为我提供实际ISurveyQuestion属性的PropertyInfo
private static PropertyInfo FindNaturalProperty<TMemberType>(Type search)
{
IDictionary<string,PropertyInfo> properties = new Dictionary<string,PropertyInfo>();
search.GetProperties().Each(prop =>
{
if (null != prop.PropertyType.GetInterface(typeof(TMemberType).Name))
properties.Add(prop.Name, prop);
});
if (properties.Count < 1) throw new ArgumentException(String.Format("{0} has no properties of type {1}", search.Name, typeof(TMemberType).Name));
if (properties.Count == 1) return properties.Values.First();
search.GetInterfaces().Each(inter =>
{
inter.GetProperties().Each(prop =>
{
if (null != prop.PropertyType.GetInterface(typeof(TMemberType).Name))
properties.Remove(prop.Name);
});
});
if (properties.Count < 1) throw new ArgumentException(String.Format("{0} has no properties of type {1} that are not members of an interface", search.Name, typeof(TMemberType).Name));
if (properties.Count > 1) throw new AmbiguousMatchException(String.Format("{0} has more than one property that are of type {1} and are not members of an interface", search.Name, typeof(TMemberType).Name));
return properties.Values.First();
}
我有PropertyInfo后如何将其转换为表达式树?
编辑:
我基本上需要的是:
results = results.Where(answer => answer.GetQuestionProperty().GetValue(answer).Wording.Contains(term));
但这不起作用所以我需要自己构建表达式树,用于linq-to-sql。
答案 0 :(得分:1)
阅读问题我认为你所追求的是Dynamic Linq - 这是一个帮助库,可以让你使用字符串动态地构建Linq查询(!),而不是在设计时。这意味着如果您可以获取您的属性名称,您应该能够动态创建查询。
ScottGu有一篇文章here
答案 1 :(得分:1)
您尝试执行的操作是创建动态查询,并且您希望查询的操作表/属性也是动态的。我不确定这是否可以根据您的使用方式轻松实现。
查看ScottGu的博文: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
和
查看Rick Strahl的博文: http://www.west-wind.com/Weblog/posts/143814.aspx
答案 2 :(得分:0)
linqpad会为你转换它。