c# - 对象到 IQueryable

标签 c#

我正在编写的 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() .

<表类="s-表"> <头> 方法 均值 错误 标准偏差 第 0 代 已分配 <正文> 查询方法 7.547 纳秒 0.1693 纳秒 0.1811 纳秒 0.0019 32 B 数组方法 26.786 纳秒 0.2870 纳秒 0.2684 纳秒 0.0072 120 B yield 法 30.609 纳秒 0.3935 纳秒 0.3680 纳秒 0.0062 104 B

编辑(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/

相关文章:

c# - 从 C# 线程调用非托管代码

c# - 内容嵌套母版页未显示

c# - 使用 Blob 在 SQLite 中存储字节数组

c# - WPF MVMVM使用行为创建对话框

c# - 将实现转换为具有泛型类型的接口(interface)

c# - 在 SendGrid SMTP API 中使用模板

c# - 如何在 asp.net 网站中启用 saml 2.0 sso

c# - 使用 Linq 合并来自两个来源的数据的更好方法

c# - 命令窗口不会为控制台应用程序打开

c# - “参数字典包含空条目”错误,Web API