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

dot*_*oob 5 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();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,唯一的区别是它们引用了"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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sat*_*tal 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();
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

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


Ant*_*t P 1

TransferWindow为什么不为和创建一个接口或抽象基类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();
} 
Run Code Online (Sandbox Code Playgroud)