动态Linq& ICompare

时间:2012-09-10 11:42:15

标签: c# linq dynamic sql-order-by

我正在尝试使用James McCormack的指南来使用Dynamic Linq定制IComparer。 - 见http://zootfroot.blogspot.co.uk/2009/10/dynamic-linq-orderby.html?showComment=1347276236930#c11348033278810583

我使用查询来拉回一个可枚举的字符串值:

.Select("fieldname").Distinct()

然后尝试使用

.OrderBy(item=>item.GetReflectedPropertyValue("fieldname"),new myComparer()) 

GetReflectedPropertyValue是James定义的辅助方法

public static string GetReflectedPropertyValue(this object subject, string field)
{
object reflectedValue = subject.GetType().GetProperty(field).GetValue(subject, null);
return reflectedValue != null ? reflectedValue.ToString() : "";
}

但得到错误“'System.Collections.Generic.IEnumerable'不包含'OrderBy'的定义和最佳扩展方法重载'System.Linq.Dynamic.DynamicQueryable.OrderBy(System.Linq.IQueryable,string ,params object [])'有一些无效的参数“

有什么想法吗?我是新手,只是在我有时间实际完成并正确学习之前尝试一些工作。

1 个答案:

答案 0 :(得分:2)

根据您发布的内容很难判断,因为OrderBy的解析将取决于myConverter的实施。但是,由于GetReflectedPropertyValue返回stringmyConverter必须实施IConverter<String>才能与OrderBy一起使用。如果没有,并且它实现类似IComparer<MyItem>之类的东西,那么编译器实际上正在寻找一个不存在的方法OrderBy(this IEnumerable<object>, Func<object,string>, IComparer<MyItem>)并吐出该错误。

如果不清楚,请提供myConverter的详细信息,我可以更具体。

如果您使用的是未实现IComparer<T>的内容,那么您可以将IComparer包含一些实现IComparable<string>的内容,以便与Orderby兼容。例如:

public class MyStringComparer : IComparer<String>
{
    readonly IComparer comparer = new MyComparer();
    public int Compare(string x, string y)
    {
        return comparer.Compare(x, y);
    }
}