SQL。但在linq上实现同样的逻辑确实很困难。您的代码为我提供了如何使其在linq上工作的完美想法,并帮助我发现了c#代码中的问题。谢谢!非常感谢您的回答。@LB2虽然代码还有一步之遥,但您提到的理论对我非常有用。我没有意识到EXISTS可能作为Join
SQL。但在linq上实现同样的逻辑确实很困难。您的代码为我提供了如何使其在linq上工作的完美想法,并帮助我发现了c#代码中的问题。谢谢!非常感谢您的回答。@LB2虽然代码还有一步之遥,但您提到的理论对我非常有用。我没有意识到EXISTS可能作为Join,c#,sql-server,linq,C#,Sql Server,Linq,SQL。但在linq上实现同样的逻辑确实很困难。您的代码为我提供了如何使其在linq上工作的完美想法,并帮助我发现了c#代码中的问题。谢谢!非常感谢您的回答。@LB2虽然代码还有一步之遥,但您提到的理论对我非常有用。我没有意识到EXISTS可能作为Join工作,所以时间复杂度比Linq中的任何一个都要好。这就解释了为什么当我将它应用到linq和Any@kim不客气。与JOIN类似的部分并不存在,而是将内部表查询中的列与外部表查询中的列相等。 select distinct(t1.ClientNu
SQL。但在linq上实现同样的逻辑确实很困难。您的代码为我提供了如何使其在linq上工作的完美想法,并帮助我发现了c#代码中的问题。谢谢!非常感谢您的回答。@LB2虽然代码还有一步之遥,但您提到的理论对我非常有用。我没有意识到EXISTS可能作为Join工作,所以时间复杂度比Linq中的任何一个都要好。这就解释了为什么当我将它应用到linq和Any@kim不客气。与JOIN类似的部分并不存在,而是将内部表查询中的列与外部表查询中的列相等。
select distinct(t1.ClientNum), month(t1.CreateDate) as monthnum from table1 t1
where
t1.CreateDate >= '2017-01-15' and
t1.CreateDate <= '2017-09-17' and
exists
(
select ClientNum, CreateDate from table1 t2
where
t2.ClientNum = t1.ClientNum and
(
(t2.CreateDate < t1.CreateDate and
t2.CreateDate > DATEADD(YEAR,-1,t1.CreateDate))
or
(t1.CreateDate < t2.CreateDate and
t1.CreateDate > DATEADD(YEAR,-1,t2.CreateDate))
)
)
db.table1
.Where(o =>
o.CreateDate >= new Datetime(2017,1,15)
&& o.CreateDate <= new Datetime(2017,9,17)
&& db.table1.Any(x =>
x.ClientNum == o.ClientNum
&& (
(x.CreateDate < o.CreateDate && x.CreateDate > o.CreateDate.Value.AddYears(-1))
|| (o.CreateDate < x.CreateDate && o.CreateDate > x.CreateDate.Value.AddYears(-1))
))
).ToList();
db.table1
.Join(db.table1, a => a.ClientNum, b => b.ClientNum, (a, b) => new { T1 = a, T2 = b })
.Where(o =>
(o.T2.CreateDate < o.T1.CreateDate
&& o.T2.CreateDate > o.T1.CreateDate.AddYear(-1))
||
(o.T1.CreateDate < o.T2.CreateDate
&& o.T1.CreateDate > o.T2.CreateDate.AddYear(-1))
).ToList();
SELECT t1.ClientNum, MAX(MONTH(t1.CreateDate)) AS monthnum FROM table1 t1
JOIN table1 t2 ON t2.ClientNum = t1.ClientNum
WHERE
t1.CreateDate >= '2017-01-15' AND
t1.CreateDate <= '2017-09-17' AND
(t2.CreateDate < t1.CreateDate AND
t2.CreateDate > DATEADD(YEAR,-1,t1.CreateDate))
OR
(t1.CreateDate < t2.CreateDate AND
t1.CreateDate > DATEADD(YEAR,-1,t2.CreateDate))
)
GROUP BY t1.ClientNum
HAVING COUNT(t2.ClientNum) = 1
List<Table1> Table1 = new List<Table1>();
var query1 = from t1 in Table1
join t2 in Table1 on t1.ClientNum equals t2.ClientNum
where t1.CreateDate >= new DateTime(2017, 1, 15) && t1.CreateDate <= new DateTime(2017, 9, 17)
&& ((t2.CreateDate < t1.CreateDate && t2.CreateDate > t1.CreateDate.AddYears(-1))
|| (t1.CreateDate < t2.CreateDate && t1.CreateDate > t2.CreateDate.AddYears(-1)))
select new { t1, t2 };
//Check either it run forerver or not
var result1 = query1.ToList();
//Check either it run forerver or not
var result = query1.GroupBy(p => p.t1.ClientNum)
.Where(p => p.Count() == 1)
.Select(p => new { ClientNum = p.Key, monthnum = p.Max(a => a.t1.CreateDate).Month })
.ToList();