动态 linq 多个与单个 .where 查询
dynamic linq multiple vs single .where query
为什么单个 where 查询给出的结果与多个 where 查询的结果不同?
query.Where("666 = ID");
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate);
query.ToString();
结果:
SELECT *
FROM [Country] AS [Extent1]
WHERE 666 = [Extent1].[ID]
以及具有多个 where 调用的相同查询
query = query.Where("ActiveFrom < @0", toDate);
query = query.Where("ActiveTo > @0", fromDate);
query = query.Where("ValidFrom < DateTime.Now");
query = query.Where("ValidTo > DateTime.Now");
结果:
SELECT *
FROM [Country] AS [Extent1]
WHERE (666 = [Extent1].[ID]) AND
([Extent1].[ActiveFrom] < convert(datetime2, '2016-10-23 11:40:35.9538054', 121)) AND
([Extent1].[ActiveTo] > convert(datetime2, '2016-06-23 11:40:35.9518052', 121)) AND
([Extent1].[ValidFrom] < (SysDateTime())) AND
([Extent1].[ValidTo] > (SysDateTime()))
因为调用不修改查询,所以它们 return 代表修改后的查询的新实例。因此,第二个示例导致大查询,而第一个示例仅导致简单的 where 条件。
为了使不同的 Where
相关,您需要将它们分配回 query
:
//instead of:
query.Where("666 = ID");
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate);
//do:
query = query.Where("666 = ID");
query = query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate);
也可以链接 Where
调用。大多数 linq 扩展方法 return IEnumerable<TSource>
因此可以链接。
在您的第二个查询上应用链接,它将如下所示:
query = query.Where("ActiveFrom < @0", toDate)
.Where("ActiveTo > @0", fromDate)
.Where("ValidFrom < DateTime.Now")
.Where("ValidTo > DateTime.Now");
为什么单个 where 查询给出的结果与多个 where 查询的结果不同?
query.Where("666 = ID");
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate);
query.ToString();
结果:
SELECT *
FROM [Country] AS [Extent1]
WHERE 666 = [Extent1].[ID]
以及具有多个 where 调用的相同查询
query = query.Where("ActiveFrom < @0", toDate);
query = query.Where("ActiveTo > @0", fromDate);
query = query.Where("ValidFrom < DateTime.Now");
query = query.Where("ValidTo > DateTime.Now");
结果:
SELECT *
FROM [Country] AS [Extent1]
WHERE (666 = [Extent1].[ID]) AND
([Extent1].[ActiveFrom] < convert(datetime2, '2016-10-23 11:40:35.9538054', 121)) AND
([Extent1].[ActiveTo] > convert(datetime2, '2016-06-23 11:40:35.9518052', 121)) AND
([Extent1].[ValidFrom] < (SysDateTime())) AND
([Extent1].[ValidTo] > (SysDateTime()))
因为调用不修改查询,所以它们 return 代表修改后的查询的新实例。因此,第二个示例导致大查询,而第一个示例仅导致简单的 where 条件。
为了使不同的 Where
相关,您需要将它们分配回 query
:
//instead of:
query.Where("666 = ID");
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate);
//do:
query = query.Where("666 = ID");
query = query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate);
也可以链接 Where
调用。大多数 linq 扩展方法 return IEnumerable<TSource>
因此可以链接。
在您的第二个查询上应用链接,它将如下所示:
query = query.Where("ActiveFrom < @0", toDate)
.Where("ActiveTo > @0", fromDate)
.Where("ValidFrom < DateTime.Now")
.Where("ValidTo > DateTime.Now");