查询FirstOrDefault的动态对象列表

时间:2012-01-23 21:10:50

标签: c# linq dynamic .net-4.0 lambda

以下代码将返回可枚举的动态对象。

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

如何选择 FirstOrDefault 以使其成为单个对象而非Enumerable?

this answer类似,但只想要SingleOrDefault。

3 个答案:

答案 0 :(得分:4)

您可以将代码与FirstOrDefault代替Where。像这样:

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

答案 1 :(得分:2)

最简单的方法可能是

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);
        }

    }

}

答案 2 :(得分:0)

就这样?

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