2013-04-18 64 views
5

我有2 linq语句 - 目前在切换块的中间。这些陈述如下。是否有可能使这2个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”和“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

'lender.ApplicationWindows'和'lender.TransferWindows'的类型是什么? – 2013-04-18 07:42:37

+0

ApplicationWindows和TransferWindows是否实现了一个包含您在LINQ中使用的字段的公共接口? – Satal 2013-04-18 07:43:15

+0

@AntP - 我添加了2个类 – dotnetnoob 2013-04-18 08:25:39

回答

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

UPDATE

如果您正在使用LINQ to SQL的,那么你可以用相同的名称创建一个局部类(在相同的命名空间),因为这两个窗口类,这些实现接口,说这实现了界面。

我认为这应该工作,虽然我没有做过这一段时间,我用VB.NET做的。

+0

打败你;) - 另外,你的'dateToCheck'变量不存在。 – 2013-04-18 07:49:42

+0

哈哈,当我看到(几乎)完全相同的代码,想知道我是否设法将它张贴两次时,我真的很困惑了一秒。伟大的思想和所有这一切:P - 谢谢我编辑了错误的部分,谢谢你:) – Satal 2013-04-18 07:51:44

+0

大声笑,感谢帮助球员 - 完成和工作 - 抱歉只能有1个赢家。 – dotnetnoob 2013-04-18 08:44:03

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

当你有方法,着眼于一个界面,越漂亮的解决方案是建立相关的扩展方法。

+0

+1使用扩展方法 - 甚至更整洁! – 2013-04-18 08:46:39

相关问题