是否有可能从这2个linq语句中制作出1个通用方法?

时间:2013-04-18 07:39:10

标签: c# linq

我有2个linq语句 - 目前位于switch块的中间。声明如下。

pwStartTime = lender.ApplicationWindows
.Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay)
.Select(w => w.StartTime)
.FirstOrDefault();


pwStartTime = lender.TransferWindows
.Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay)
.Select(w => w.StartTime)
.FirstOrDefault();

正如您所看到的,唯一的区别是它们引用了“lender”的两个不同属性,但是,linq查询中使用的所有元素在“ApplicationWindows”和“TransferWindows”中都是相同的,尽管它们不相同对象和每个对象都包含其他独特的属性。

那么,是否可以通过一种通用方法返回w.StartDate?

提前致谢。

//这是2个班级

public class ApplicationWindow
{
    public string Name { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}

public class TransferWindow
{
    public string Name { get; set; }

    public DateTime StartTime { get; set; }

    public DateTime EndTime { get; set; }

    [XmlIgnore]
    public TimeSpan Cycle { get; set; }

    [Browsable(false)]
    [XmlElement("Cycle")]
    public string CycleString
    {
        get { return XmlConvert.ToString(Cycle); }
        set { Cycle = value.IsNullOrEmpty() ? TimeSpan.Zero : XmlConvert.ToTimeSpan(value); }
    }
}

3 个答案:

答案 0 :(得分:5)

如果ApplicationWindows和TransferWindows实现了一个通用接口,那么您可以执行以下操作;

public DateTime GetStartTime(IEnumerable<IWindow> windows, string pwPeriod, TimeSpan timeOfDay)
{
    return windows.Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > timeOfDay)
        .Select(w => w.StartTime)
        .FirstOrDefault();
}

<强>更新

如果您正在使用LINQ To SQL,那么您可以通过创建一个与两个Window类具有相同名称(并在同一名称空间中)的部分类来实现接口,并说这实现了接口。

我相信这应该有用,虽然我有一段时间没有这样做,我用VB.NET做过。

答案 1 :(得分:3)

您可以使用接口执行的操作示例:

pwStartTime = lender.ApplicationWindows.FirstOrDefaultDateTime(pwPeriod, dateToCheck);
pwStartTime = lender.TransferWindows.FirstOrDefaultDateTime(pwPeriod, dateToCheck);

public interface IWindow
{
    string Name { get; }
    public DateTime StartTime { get; }
    public DateTime EndTime { get; }
}

public class ApplicationWindow : IWindow
{
    public string Name { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}

public class TransferWindow : IWindow
{
    public string Name { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}

public static class IWindowExt
{
    public static DateTime FirstOrDefaultDateTime(this IEnumerable<IWindow> windows, string pwPeriod, DateTime dateToCheck)
    {
        return windows
                .Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay)
                .Select(w => w.StartTime)
                .FirstOrDefault();
    }
}

当你有一个针对一个界面的方法时,更漂亮的解决方案是创建相关的扩展方法。

答案 2 :(得分:1)

为什么不为TransferWindowApplicationWindow创建接口或抽象基类,定义公共属性?然后你可以做这样的事情(假设lender.TransferWindowslender.ApplicationWindows是他们各自类的列表 - 如果没有,则根据需要修改方法签名):

public DateTime GetStartTime(IList<Window> windows, DateTime dateToCheck, string pwPeriod)
{
    return windows
    .Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay)
    .Select(w => w.StartTime)
    .FirstOrDefault();
}