是否有可能从这两个linq语句中创建一个泛型方法?

本文关键字:创建 泛型方法 语句 一个 两个 有可能 是否 linq | 更新日期: 2023-09-27 18:09:41

我有两个linq语句-目前在一个开关块的中间。语句如下:

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();

正如你所看到的,唯一的区别是它们引用了"贷方"的两个不同的属性,然而,linq查询中使用的所有元素在"ApplicationWindows"answers"TransferWindows"中是相同的,尽管它们不是相同的对象,并且每个都包含其他独特的属性。

所以,它有可能返回w.s startdate通过一个泛型方法?

提前感谢。

//这是两个类

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); }
    }
}

是否有可能从这两个linq语句中创建一个泛型方法?

如果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,那么你可以通过创建一个与两个窗口类同名(在相同的命名空间中)的部分类来实现接口,并说这实现了接口。

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

你可以用接口做的一个例子:

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();
    }
}

当您的方法只针对一个接口时,更好的解决方案是创建与之相关的扩展方法

为什么不为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();
}