Какую самую страшную функцию LINQ вы видели? - PullRequest
0 голосов
/ 12 мая 2009

Во время работы над личным проектом я хотел простой сервис для извлечения элементов из Outlook и размещения в WCF в «RESTful» дизайне. В процессе я придумал этот довольно зверский класс.

Какой еще страшный код linq видели люди?

public IQueryable<_AppointmentItem> GetAppointments(DateTime date)
{
    var dayFlag = (OlDaysOfWeek)(int)Math.Pow(2, (int)date.DayOfWeek);
    return
        OlDefaultFolders.olFolderCalendar.GetItems<_AppointmentItem>()
        .Select(a => new
        {
            Appointment = a,
            RecurrencePattern = a.IsRecurring ? 
                                a.GetRecurrencePattern() : null
        })
        .Where(a =>
            a.Appointment.Start.Date <= date &&
            (
                (a.RecurrencePattern == null && 
                 a.Appointment.End.Date >= date) ||
                (
                    a.RecurrencePattern != null &&
                    (
                        (a.RecurrencePattern.DayOfMonth == 0 ||
                         a.RecurrencePattern.DayOfMonth == date.Day) &&
                        (a.RecurrencePattern.DayOfWeekMask == 0 || 
                         ((a.RecurrencePattern.DayOfWeekMask & 
                           dayFlag) != 0)) &&
                         (a.RecurrencePattern.MonthOfYear == 0 || 
                          a.RecurrencePattern.MonthOfYear == date.Month)
                    )
                )
            )
        )
        .Select(a => a.Appointment);
}

[OperationContract()]
[WebGet(
    UriTemplate = "/appointments/{year}/{month}/{day}",
    RequestFormat = WebMessageFormat.Xml,
    ResponseFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Bare
    )]
[ContentType("text/xml")]
public XElement ListAppointments(string year, string month, string day)
{
    try
    {
        int iYear, iMonth, iDay;
        int.TryParse(year, out iYear);
        int.TryParse(month, out iMonth);
        int.TryParse(day, out iDay);

        if (iYear == 0) iYear = DateTime.Now.Year;
        if (iMonth == 0) iMonth = DateTime.Now.Month;
        if (iDay == 0) iDay = DateTime.Now.Day;

        var now = new DateTime(iYear, iMonth, iDay).Date; // DateTime.Now;
        return GetAppointments(now).ToXml();
    }
    catch (System.Exception ex)
    {
        return new XElement("exception", ex.ToString());
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Office.Interop.Outlook;

namespace WhitedUS.ServiceModel.Office.Linq
{
    public static class OutlookUtilities
    {
        public static IQueryable<T> GetItems<T>(
            this OlDefaultFolders defaultFolderType)
        {
            return
                new ApplicationClass()
                .Session
                .GetDefaultFolder(defaultFolderType)
                .Items
                .OfType<T>()
                .AsQueryable();
        }

        public static XElement ToXml<T>(this IEnumerable<T> input)
        {
            if (input == null)
                return null;

            Type typ = typeof(T);
            var root = XName.Get(typ.Name.Trim('_'));

            return new XElement(root,
                input
                .Select(x => x.ToXml<T>())
                .Where(x => x != null)
                );
        }

        public static XElement ToXml<T>(this object input)
        {
            if (input == null)
                return null;

            Type typ = typeof(T);
            var root = XName.Get(typ.Name.Trim('_'));

            return new XElement(root,
                typ.GetProperties()
                .Where(p => p.PropertyType.IsValueType || 
                       p.PropertyType == typeof(string))
                .Select(p => new { Prop = p, Getter = p.GetGetMethod() })
                .Where(p => p.Getter != null)
                .Select(p => new { Prop = p.Prop, Getter = p.Getter, 
                                   Params = p.Getter.GetParameters() })
                .Where(p => (p.Params == null || p.Params.Count() <= 0))
                .Select(p => new { Name = p.Prop.Name, 
                                   Value = p.Getter.Invoke(input, null) })
                .Where(p => p.Value != null)
                .Select(p => new XAttribute(XName.Get(p.Name), p.Value))
                );
        }
    }
}

Также см .: Какое худшее злоупотребление вы видели в синтаксисе LINQ?

Ответы [ 2 ]

8 голосов
/ 12 мая 2009

Полностью LINQified RayTracer довольно страшно.

0 голосов
/ 12 мая 2009

На самом деле, самый страшный запрос Linq, который я когда-либо видел, был моим первым. Это было достаточно знакомо, чтобы заставить меня думать, что я понял это, и достаточно отличалось, чтобы заставить меня усомниться в том, что я действительно понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...