查询FirstOrDefault的动态对象列表

本文关键字:对象 列表 动态 FirstOrDefault 查询 | 更新日期: 2023-09-27 18:21:07

以下代码将返回动态对象的Enumerable。

protected override dynamic Get(int id)
{ 
    Func<dynamic, bool> check = x => x.ID == id;
    return  Enumerable.Where<dynamic>(this.Get(), check);
}

如何选择FirstOrDefault,使其成为单个对象而不是可枚举对象?

类似于这个答案,但只是想要SingleOrDefault。

查询FirstOrDefault的动态对象列表

您可以将代码与FirstOrDefault一起使用,而不是与Where一起使用。像这样:

protected override dynamic Get(int id)
{ 
    Func<dynamic, bool> check = x => x.ID == id;
    return Enumerable.FirstOrDefault<dynamic>(this.Get(), check);
}

最简单的方法可能是

protected override dynamic Get(int id)
{ 
    return Get().FirstOrDefault(x=>x.ID==id);
}

由于有些人在这方面遇到了困难,为了进行测试,只需执行一个新的.NET 4.0控制台项目(如果您从3.5版本转换,则需要添加System.Core和Microsoft.CSharp引用),并将其粘贴到Program.cs中。在我测试过的3台机器上,编译和运行都没有问题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Dynamic;
namespace ConsoleApplication1
{
    internal class Program
    {
        protected dynamic Get2(int id)
        {
            Func<dynamic, bool> check = x => x.ID == id;
            return Enumerable.FirstOrDefault<dynamic>(this.Get(), check);
        }
        protected dynamic Get(int id)
        {
            return Get().FirstOrDefault(x => x.ID == id);
        }
        internal IEnumerable<dynamic> Get()
        {
            dynamic a = new ExpandoObject(); a.ID = 1;
            dynamic b = new ExpandoObject(); b.ID = 2;
            dynamic c = new ExpandoObject(); c.ID = 3;
            return new[] { a, b, c };
        }
        static void Main(string[] args)
        {
            var program = new Program();
            Console.WriteLine(program.Get(2).ID);
            Console.WriteLine(program.Get2(2).ID);
        }
    }
}

就是这样吗?

protected override dynamic Get(int id)
{ 
    Func<dynamic, bool> check = x => x.ID == id;
    return Enumerable.Where<dynamic>(this.Get(), check).FirstOrDefault();
}