我正在编写的 API 始终需要 IQueryable 作为返回类型,即使它是单个对象。这是强加的,我无法更改。我将如何从对象创建 IQueryable。
我现在的代码感觉不对。
List<Entity> listOfEntity = new List<Entity>();
listOfEntity.Add(entity);
IQueryable<Entity> queryableEntity = listOfEntity.AsQueryable();
最佳答案
编辑(2022 年):julealgon 促使我在多年后回顾这段代码,我不得不同意他们的观点,即数组初始化不是必需的。我很快想出了下面的代码,可以将其用作自己实现它的基线。
void Main()
{
var singleValueQueryable = "Foo".ToQueryable();
foreach (var item in singleValueQueryable)
{
Console.WriteLine(item);
}
}
public static class ObjectExtensionMethods
{
public static IQueryable<T> ToQueryable<T>(this T instance)
{
return new SingleValueQueryable<T>(instance);
}
}
public class SingleValueQueryable<T> : IQueryable<T>, IEnumerator<T>
{
private bool hasExecutedOnce = false;
public SingleValueQueryable(T value)
{
this.Current = value;
}
public Type ElementType => typeof(T);
public Expression Expression => throw new NotImplementedException();
public IQueryProvider Provider => throw new NotImplementedException();
public IEnumerator<T> GetEnumerator()
{
return this;
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public T Current { get; set; }
object IEnumerator.Current => this.Current;
public void Dispose()
{
}
public bool MoveNext()
{
if (hasExecutedOnce)
{
return false;
}
hasExecutedOnce = true;
return true;
}
public void Reset()
{
this.hasExecutedOnce = false;
}
}
以下是三种方法的基准。 QueryableMethod 就是上面显示的方法。 ArrayMethod 是基准下方显示的方法(这是先前的答案)。 YieldMethod 只是一个 yield return
结合 AsQueryable()
.
编辑(2017):像 kienct89 我创建了一个通用的扩展方法以便于使用:
public static class ObjectExtensionMethods
{
public static IQueryable<T> ToQueryable<T>(this T instance)
{
return new [] {instance}.AsQueryable();
}
}
只需在您创建的对象上调用该方法即可:
object anObject = new object();
anObject.ToQueryable();
@kienct89: Wow that is almost exactly what I did, even the names match, I just took array because it seemed less expensive, you did it in one line:
public static class ObjectExtensionMethods { public static IQueryable<T> ToQueryable<T>(this T instance) { TEntityType[] arrayOfObject = {instance}; return arrayOfObject.AsQueryable(); } }
With both our answers I changed it to:
public static class ObjectExtensionMethods { public static IQueryable<T> ToQueryable<T>(this T instance) { return new [] {instance}.AsQueryable(); } }
关于c# - 对象到 IQueryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45077946/