自定义LINQ风格的实现

时间:2016-04-17 22:20:15

标签: c# linq linq-expressions

我希望实现一个非常简单的方法来允许使用LINQ样式的语法。例如:

var res = ctx.Users.Where(x=>x.Name == "test" && x.Id > 1); 

我正在尝试实现Where()方法。

总体思路是让此Where()方法执行特定于数据源的查询,以使用可能可用的索引快速获取数据的子集。链接的任何后续方法将使用LINQ-to-Objects对内存中的IEnumerable执行。

我可以使用以下实现来实现此目的:

public IEnumerable<T> Where(Expression<Func<T, bool>> predicate)
{
    //work with predicate body and return result of query
    return new List<T>();
}

我注意到的唯一问题是构建LINQ Expression对象时性能有点慢。这很重要,因为我正在使用非常快速的本地(非SQL)存储。有没有办法只是将原始输入作为字符串(或其他一些格式)获取,以便我可以使用自定义解析逻辑?我知道我可以把它作为一个字符串参数,但我确实喜欢使用LINQ lambda语法进行的类型检查。

1 个答案:

答案 0 :(得分:0)

通过回答问题,我认为扩展方法会让你想要你想要的。该方法看起来像这样:

    public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate)
    {
        //process each item individually
        List<T> returnValue = new List<T>();
        foreach (var t in source)
        {
            string stringToParse = t.ToString();

            //do things
            string parsedString = stringToParse.ToUpper();

            //create your new object and add to the list that will be returned
            returnValue.Add((T)Activator.CreateInstance(typeof(T), parsedString));
        }

        return returnValue;
    }

这可能不会为您带来性能提升。此外,该方法预先进行所有计算,而不是逐个提供结果(使用yield功能);但是,这很容易修改:

    public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate)
    {
        //process each item individually
        foreach (var t in source)
        {
            string stringToParse = t.ToString();

            //do things
            string parsedString = stringToParse.ToUpper();

            //return your transformed object
            yield return (T)Activator.CreateInstance(typeof(T), parsedString);                
        }
    }

快速注意:因为您希望方法签名与IEnumerable.Where相同,所以您需要选择不同的方法名称。