我希望实现一个非常简单的方法来允许使用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语法进行的类型检查。
答案 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
相同,所以您需要选择不同的方法名称。