我有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); }
}
}
答案 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)
为什么不为TransferWindow
和ApplicationWindow
创建接口或抽象基类,定义公共属性?然后你可以做这样的事情(假设lender.TransferWindows
和lender.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();
}