запросить список динамических объектов для FirstOrDefault - PullRequest
0 голосов
/ 24 января 2012

Следующий код вернет Enumerable из динамических объектов.

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

Как выбрать FirstOrDefault , чтобы это был один объект, а не Enumerable?

Подобно этому ответу , но просто хочу SingleOrDefault.

Ответы [ 3 ]

4 голосов
/ 24 января 2012

Вы можете использовать свой код с FirstOrDefault вместо Where. Как это:

protected override dynamic Get(int id)
{ 
    Func<dynamic, bool> check = x => x.ID == id;
    return Enumerable.FirstOrDefault<dynamic>(this.Get(), check);
}
2 голосов
/ 24 января 2012

Самый простой способ, вероятно,

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

Поскольку у некоторых людей возникли проблемы с выполнением этой работы, для тестирования просто создайте новый проект консоли .NET 4.0 (если вы переходите с версии 3.5, вам нужно добавить ссылки System.Core и Microsoft.CSharp) и вставить ее в программу. 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);
        }

    }

}
0 голосов
/ 24 января 2012

Просто так?

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