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