2016-03-09 4 views
1

Моя задача - преобразовать следующий SQL-запрос в LINQ с помощью функции Groupby, Orderby, Date.Преобразование SQL-запроса в функцию LINQ - DateDiff

SELECT 
     sd.name, s.BuilderName, 
     Min(Date) as MinDatetime, 
     Max(Date) as MaxDatetime, 
     datediff(day, min(Date), max(Date))/ cast (count(sd.jobRobosname) as float) 
FROM 
     [Data] sd 
JOIN Example s ON s.name= sd.Name 
WHERE jobRobosjobid='NOT RUN' 
GROUP BY sd.name, s.name 

Я попытался, как,

(from record in _db.Data        
join jobRobos in _db.Example on record.Name equals Example.Name 
where record.jobRobos jobid != "NOT RUN" 
    group jobRobos by new {record.Name,jobRobos .BuilderName} into r 
select new 
{ 
    jobRobos Name = r.Key.jobRobos Name, 
    BuilderName = r.Key.BuilderName, 
    MaxDate = r.Key.Min(r.Date), 
    MinDate = r.Max(c => c.Date), 
    Diff = r.Key.datediff(day, MinDate, MaxDate)/r.Key.Cast(Count(r.Key.jobRobos Name) as float) 
}).ToList(); 

я упомянул некоторые из подобных вопросов здесь нравится:

Но не удалось найти решение.

Может ли кто-нибудь предложить мне некоторые идеи?

+0

Можете ли вы утверждать ошибки вы получаете? –

+0

Указывает текст ошибки как «AnanymousType Error» –

+0

Вы добавили теги для mySQL и SQL Server. Что вы используете? Если последнее, то вы можете использовать 'SqlMethods.DateDiffDay' - см. [MSDN] (https://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.datediffday (v = vs. 110) .aspx) – strickt01

ответ

1

С EF 6 это должно работать, используя DbFunctions.DiffDays:

(from record in _db.Data        
join spider in _db.Example on record.Name equals Example.Name 
where record.spiderjobid != "NOT RUN" 
    group spider by new {record.Name,spider.BuilderName} into r 
select new 
{ 
    Name = r.Key.Name, 
    BuilderName = r.Key.BuilderName, 
    MaxDate = r.Max(d => d.Date), 
    MinDate = r.Min(d => d.Date), 
    Diff = DbFunctions.DiffDays(r.Max(d => d.Date), r.Min(d => d.Date))/r.Count(d => d.SpiderName) 
}).ToList(); 
+0

Здесь значение Diff должно быть Float. Тогда нужно ли действовать на литье? – sara

+0

Да, точка взята. Однако приведение к 'float' может привести к ошибке LINQ to Entities. Если да, то просто возвращаем 'DateDiff' и' Count' отдельно, а затем выполняем листинг как часть отображения анонимного типа, возвращенного из SQL в модель. – strickt01

+0

Здесь дана анонимная ошибка – sara