5

我有 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); }
    }
}
4

3 回答 3

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 做到的。

于 2013-04-18T07:46:39.290 回答
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();
    }
}

当您有针对一个接口的方法时,更漂亮的解决方案是创建关联的扩展方法。

于 2013-04-18T08:37:49.040 回答
1

TransferWindow为什么不为and创建一个接口或抽象基类ApplicationWindow,定义公共属性呢?然后你可以做这样的事情(假设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();
} 
于 2013-04-18T07:46:04.397 回答