C# 动态linq多对单where查询

C# 动态linq多对单where查询,c#,linq,dynamic-linq,C#,Linq,Dynamic Linq,为什么单个where查询给出的结果与多个where查询不同 query.Where("666 = ID"); query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate); 以及具有多个where调用的同一查询 query = query.Wher

为什么单个where查询给出的结果与多个where查询不同

query.Where("666 = ID");
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate);
以及具有多个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");
query=query.Where(“ActiveFrom<@0”,toDate);
query=query.Where(“ActiveTo>@0”,fromDate);
query=query.Where(“ValidFromDateTime.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()))
选择*
来自[国家]作为[延伸1]
其中(666=[Extent1].[ID]),和
([Extent1][ActiveFrom]convert(datetime2,'2016-06-23 11:40:35.9518052',121))和
([Extent1].[ValidFrom]<(SysDateTime())和
([Extent1].[ValidTo]>(SysDateTime()))

因为调用不会修改查询,所以它们会返回一个表示修改后的查询的新实例。因此,第二个示例产生大查询,而第一个示例只产生一个简单的where条件。

为了使不同的
where
相关,您需要将它们分配回
查询:

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

不确定这是不是一个愚蠢的问题,但根据你发布的代码。。。在第一个示例中,您是否设置了query=“first where”,然后再次设置了第二个where?
query.where(“666=ID”)
没有做任何事情,因为您没有将此查询分配给变量,而您的第二个示例执行此操作。
//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);
query = query.Where("ActiveFrom < @0", toDate)
             .Where("ActiveTo > @0", fromDate)
             .Where("ValidFrom < DateTime.Now")
             .Where("ValidTo > DateTime.Now");