2009-08-29 3 views
2

Активность происходит в месте в определенную дату, но каждое действие может повторяться в одном и том же или разных местах в разные даты. Я создал модель фреймворка сущности и хочу заполнить ее соответствующими действиями, которые происходят между двумя датами, упорядоченными по расстоянию на расстоянии от указанного места.Linq или Stored proc - Что выбрать?

Я, следовательно, имеют следующие таблицы:

активность (А)

Происшествие (O)

Местонахождение (L)

С отношениями следующим образом:

A 1-n O n-1 L

У меня есть некоторые ди Это можно сделать с помощью linq для сущностей, но я уверен, что могу добиться этого в хранимой процедуре.

Является ли это чем-то, что я мог бы сделать, используя Linq, или это слишком сложная проблема для Linq для создания Sql? Любые указатели на запись запроса Linq будут оценены, если это то, что он должен сделать.

ответ

0
var query = from occurrence in occurrenceList 
      join activity in activityList on occurrence.ActivityID equals activity.ID 
      join location in locationList on occurrence.LocationID equals location.ID 
      let distance = CLocation.Distance (referenceLocation, location) 
      orderby distance, activity.Name 
      where start <= occurrence.Date && occurrence.Date <= end 
      select new 
      { 
       ActivityName = activity.Name, 
       LocationName = location.Name, 
       Distance = distance, 
       Date = occurrence.Date 
      };
+1

Это можно сделать с помощью LINQ, но я согласен с Hakan Winther: хранимая процедура кажется более подходящим местом для установки такой логики. – XXXXX

2

Я не понимаю, почему это невозможно сделать или даже особенно сложно. Это был вопрос? :)

Таблица действий не интересна вашему запросу, как я ее понимаю, начиная с поиска Occurrences. Вы можете включать в себя данные Activity на выходе, как это:

dc.Occurrence.Include("Activity").Where(
    o => o.Date >= startDate && o.Date <= endDate 
    && o.Location.DistanceFrom(someLocation) < maxDistance) 

DistanceFrom будет, однако вы определить расстояние от места .. Я не знаю, как что-нибудь о ваших базах данных.

Если вы используете геокодирование SQL Server 2008, я не думаю, что это поддерживается. This articlethis continuation) может представлять интерес. Речь идет о LINQ to SQL, но построение выражений может помочь.

+0

Я возмущен нисходящим: P Вопрос был изменен. Первоначально он ничего не сказал о предоставлении указателей о запросе LINQ ... – Thorarin

+0

Спасибо, я не понимаю, почему голосующий голос, оставляя его без комментариев, довольно бесполезен имхо ..Спасибо за добавленные ссылки, я видел первый, но второй, похоже, отвечает на мой вопрос. Из-за расчёта расстояния, использующего linq, происходит медленно, и поэтому рекомендуется использовать sp. Как в стороне, ваш код действительно дает ошибку компиляции: «Делегат» System.Func 'не принимает 1' аргументов ". Любая идея, почему это может быть? – Richbits

+0

Thoarin cool :) Я просто превратил его в upvote, я пропустил редактирование, сожалею о том, что я плохой. – olle

0

В Linq2Sql, дизайнер будет автоматически создавать отношения в классах L2S (но не отображать их в конструкторе)

В Linq2Entities, дизайнер будет отображать внешний ключ, но не будет автоматически создавать их - это должно быть сделано вручную. (это утверждение было основано на бета-версии Linq2Entities --- это может быть уже не так).

+0

Отношения автоматически создаются. – Thorarin

+0

нет, он получает их из базы данных, если они есть. Если у вас есть база данных без связей, то у вас нет отношений в вашей модели данных linq-2-sql, пока вы не добавите их вручную. –

1

Я не использовал Linq, и, может быть, я совершенно не прав, но не могу использовать хранимую процедуру, даже если вы используете Linq? Одной из основных причин использования Хранимой процедуры является скрытие подкласса базы данных с бизнес-уровня. Скрывая данные, вы можете оптимизировать доступ к данным. Эти процедуры используются как интерфейс для приложений и отчетов, и если вам нужно изменить модель данных, это можно сделать без нарушения интерфейса.

Это мое мнение с точки зрения DBA. Как я уже сказал, я понятия не имею, что такое щенок Линк.

+0

Да, вы совершенно неправы - вы можете. В некоторых случаях обработка данных должна выполняться на db, поскольку она намного эффективнее, даже если вы используете модель linq-2-sql. Я предполагаю, что какой-то человек будет использовать это как аргумент для того, чтобы не использовать linq-2-sql. Я не согласен, но потребуется время, чтобы объяснить. –

+0

Думаю, мы пропустим друг друга. Я пытаюсь сказать, что если вы используете Linq с хранимыми процедурами, все в порядке. Как администратор базы данных, я хочу, чтобы обработка данных выполнялась в БД. –

Смежные вопросы