2016-03-15 3 views
-1

Я имею детали дату, которая в формате (дд/мм/гггг), как,Запрос LINQ, чтобы найти разницу по дате?

Таблица № 1

id Name date   User 
-------------------------------- 
1 xxx 01/01/2016  user1 
2 yyy 01/02/2016  user2 
3 aaa 02/03/2016  user1 

Таблица № 2

id Name  date 
-------------------- 
1 xxx 07/01/2016 
2 xxx 09/01/2016 
3 yyy 05/02/2016 
4. aaa 04/03/2016 

РЕДАКТИРОВАТЬ 1: Логика: в первый раз, когда xxx, указанная в таблице2, означает, что она получает дату из таблицы1 для вычисления разницы в день. В следующий раз, когда значение xxx произошло, оно получает дату из таблицы2 (а не table1). Поскольку таблица2 уже имеет значение в этой таблице. Таким образом, разница в день будет вычисляться с использованием только таблицы 2. То же самое и для других значений. EDIT 2: На самом деле, мне нужно получить разницу во времени для значения. Я должен получить разницу дат, используя Таблицу 1, если Имя произошло в первый раз. И чтобы получить разницу Dtae от Таблицы 2, Если Имя произошло раньше. Я имею поле «Name», как UNIQUE Результат должен быть, как

user Name  DateDifference 
------------------------------------ 
user1 xxx 6 (07/01/2016 - 01/01/2016) 
user1 xxx 2 (07/01/2016 - 09/01/2016) 
user2 yyy 4 (01/02/2016 - 05/02/2016) 
user1 aaa 2 (02/03/2016 - 04/03/2016) 

LINQ запрос Я попытался это,

var query = (from item1 in Table1 
       join item2 in Table1 on item1.Name equals item2.Name 
       where item2.Date > item1.Date 
       join origin in Table2 on item1.Name equals origin.Name 
       where // condition 
       group new { item1,item2 } by new { item1.Name,item1.Date } into grp 
       select new 
       {     

        DayDiff = DbFunctions.DiffDays(grp.Key.Date, grp.Min(d => d.item2.Date)), 
       } 
       ).ToList(); 

Но я не мог получить результат ожидается. Я также знаю об этом вопросе, How to get the date difference by joining two tables?, но, в конце концов, они не закончили его в правильной опции запроса LINQ.

Как мой вопрос отличается от How to get the date difference by joining two tables?? Ответ на SQL. Мне нужно закодировать его в LINQ.

+0

http://stackoverflow.com/questions/11793079/ linq-select-to-new-object-setting-values-of-object-in-function –

+0

Я буду ссылаться на это, спасибо –

+0

Вы храните datetime-строки или реальные даты? –

ответ

1

Я надеюсь, что по крайней мере у вас есть свойство навигации над этими двумя tables.Try это

class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var db = new aaContext2()) 
      { 
       IList<DTO> dto = new List<DTO>(); 
       dto = db.Table2.Select(a => new DTO 
       { 
        Name = a.Name, 
        User = a.Namea.User, 
        DateDifference = (DbFunctions.DiffDays(a.Date, db.Table2.Where(aa => aa.Name.Equals(a.Name) && a.Date < aa.Date).Min(dd => dd.Date) 
        ) ?? (DbFunctions.DiffDays(db.Table1.Where(aa => aa.Name.Equals(a.Name)).Min(aaa => aaa.Date), a.Date))) 
       }).ToList(); 
      } 
     } 
    } 
    public class DTO 
    { 
     public string User { get; set; } 
     public string Name { get; set; } 
     public int? DateDifference { get; set; } 
    } 
    public class aaContext2 : DbContext 
    { 
     public DbSet<Table1> Table1 { get; set; } 
     public DbSet<Table2> Table2 { get; set; } 

    } 
    public class Table1 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public virtual IList<Table2> NameList { get; set; } 

     public DateTime Date { get; set; } 
     public string User { get; set; } 

    } 
    public class Table2 
    { 
     public int Id { get; set; } 
     public virtual Table1 Namea { get; set; } 
     public string Name { get; set; } 
     public DateTime Date { get; set; } 
    } 

} 
1

Вот один из возможных способов:

var query = 
    (from t1 in db.Table1 
    join t2 in db.Table2 on t1.Name equals t2.Name 
    let prevDate = (from t3 in db.Table2 
        where t3.Name == t2.Name && t3.Date < t2.Date 
        select (DateTime?)t3.Date).Max() ?? t1.Date 
    select new 
    { 
     t1.User, 
     t1.Name, 
     DayDiff = DbFunctions.DiffDays(prevDate, t2.Date).Value, 
    }).ToList(); 
Смежные вопросы