0

我有一个 DateRange 对象列表,它们具有 StartDate 和 EndDate 属性。我需要从我的数据库中的表中选择所有行,这些行的 DateTime 字段属于这些 DateRanges 中的任何一个。所以我想做这样的事情:

// Using an IQueryable<DateRange> called dateRanges
var tests = from test in dbContext.Tests
            where dateRanges.Any(range => range.StartDate <= test.Date && range.EndDate >= test.Date)
            select test

这给了我一个错误,因为 DateRange 不是原始类型,因此 LINQ to SQL 不能使用它。有没有其他方法可以做我在这里想做的事情?几个小时以来一直在谷歌搜索和尝试不同的事情,我觉得我很接近但不能完全到达那里。提前致谢。

4

3 回答 3

0

为了保证没有不必要的数据被传输,我决定这样做的方法是在我的数据库上创建一个名为 GetTestsInDateRange 的存储过程,它接收开始和结束日期并返回该范围内的所有测试。然后在我的代码中,我遍历我的 DateRanges 列表,为每个 DateRange 调用一次存储过程,并将结果合并在一起。

IEnumerable<Test> tests = new List<Test>();
foreach (DateRange range in selectedDateRanges)
{
    tests = tests.Union(dbContext.GetTestsInDateRange(range.StartDate, range.EndDate));
}

我不知道这是否是理想的解决方案(可能取决于选择了多少 DateRanges,因此它对数据库进行了多少单独的调用),但它适用于我的场景。

于 2013-10-25T16:45:16.650 回答
0

尝试将 Linq2Sql 与动态查询一起使用,例如

(p => value1.StartDate <= p.Date && value1.EndDate >= p.Date) || (p => value2.StartDate <= p.Date && value2.EndDate >= p.Date)

示例:Linq2SQL“或/与”运算符(ANDed / ORed 条件)

于 2013-10-25T15:53:41.703 回答
-1

除了通过连接每个范围的条件来制作您自己的 SQL 语句之外,部分限制您返回的结果的一种方法是使用范围的最小和最大日期,然后在 Linq-To-Objects 中进一步过滤:

var minStartDate = dateRanges.Min(r => r.StartDate);
var maxEndDate = dateRanges.Max(r => r.EndDate);
var tests = (from test in dbContext.Tests
            where minStartDate <= test.Date && maxEndDate >= test.Date
            select test)
            .AsEnumerable()  // change to Linq-To-Objects
            .Where(test => dateRanges.Any(range => range.StartDate <= test.Date 
                                                   && range.EndDate >= test.Date));

这对于一个范围来说是完美的,除非你的范围之间有巨大的差距,否则只会稍微差一点。

于 2013-10-25T15:59:39.570 回答