你见过的最可怕的LINQ功能是什么?

时间:2022-09-20 19:36:45

While working on a personal project I wanted a simple service to extract items out of Outlook and host in WCF in a "RESTful" design. In the process I came up with this rather beastly class.

在处理个人项目时,我想要一个简单的服务,从Outlook中提取项目,并以“RESTful”设计在WCF中托管。在这个过程中,我提出了这个相当野兽的课程。

What other scary linq code have people have seen?

人们看到了哪些其他可怕的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))
                );
        }
    }
}

Also see: What is the worst abuse you’ve seen of LINQ syntax?

另请参阅:您在LINQ语法中看到的最糟糕的滥用是什么?

2 个解决方案

#1


A fully LINQified RayTracer is pretty scary.

完全LINQified RayTracer非常可怕。

#2


Actually, the scariest Linq query I ever saw was my first one. It was just familiar enough to make me think I understood it and just different enough to make me doubt that I really did.

实际上,我见过的最可怕的Linq查询是我的第一个。它只是熟悉,让我觉得我理解它,只是让我怀疑我真的这么做。

#1


A fully LINQified RayTracer is pretty scary.

完全LINQified RayTracer非常可怕。

#2


Actually, the scariest Linq query I ever saw was my first one. It was just familiar enough to make me think I understood it and just different enough to make me doubt that I really did.

实际上,我见过的最可怕的Linq查询是我的第一个。它只是熟悉,让我觉得我理解它,只是让我怀疑我真的这么做。