LINQ2SQL + PLINQO: Как справиться с такой простой ситуацией? - PullRequest
1 голос
/ 26 ноября 2009

Я новичок в PLINQO, я довольно новичок в LINQ2SQL и добавляю новый DAL (называемый DAL2) параллельно с нашим старым существующим DAL. Наша идея состоит в том, чтобы начать использовать linq2sql для каждой новой вещи, которую мы добавляем, и постепенно начинать перемещать старое использование DAL в новое DAL2.

Как все мы знаем, DLINQ хорош для простых вещей, но в более сложных сценариях (многие2, отсоединенные объекты и т. Д.) Проблемы возникают мгновенно, и возникает новая необходимость взломать его. PLINQO (вместе с CodeSmish) приходит на помощь и добавляет всю необходимую структуру и инструменты, чтобы сделать его более удобным. Все идет нормально.

Теперь у меня уже есть DAL2 (я использую менеджеров). Оно работает". Но у меня есть несколько сомнений.

Я понимаю, что возвращение объекта состоит из следующего запроса:

select name,  Count(*) as Total from SomeTable 

… это не странный сценарий в большинстве приложений БД. Запрос представляет собой простой пример того, что было бы хорошим анонимным типом.

Теперь на секунду представьте структуру таблицы, подобную этой.

Tag (1) <—> (n) PatientTag (n) <—> (1) Patient

Идея состоит в том, чтобы узнать, сколько пациентов имеет каждая метка. Простое внутреннее соединение исправит это с помощью SQL, между тегом и тегом пациента. Для этого мне даже не нужен доступ к столу пациента. (Мне просто нужен счет).

В конце концов, все, что я хочу, например:

TAG1, 33

TAG2, 21

TAG3, 6

и т.д ...

Предположим, мне удалось создать запрос linq2sql, который делает это:

   var result1 = from pt in dc.PatientTag
                 join t in dc.Tag on pt.TagId equals t.TagId
                 select new { TagName = t.TagName };


   var result2 = from q in result1
                 group q by q.TagName into gp
                 select new { TagName = gp.Key, Total = gp.Count() };

(я новичок в LINQ, поэтому, если вышеупомянутое нехорошо, простите за отсутствие «LINQissm»)

Учитывая, что я не могу вернуть этот «новый» анонимный тип (если я не обращаюсь к объекту и отражению, что не является моим намерением), я предполагаю, что мне нужно создать «вспомогательный» класс, содержащий две вещи (имя и общее количество) , Идея состоит в том, что приведенный выше код должен находиться где-то на уровне данных или бизнес-уровне, а не в коде пользовательского интерфейса.

Теперь реальный вопрос:

Если вышеприведенное верно, где я должен создать этого «помощника», если я хочу вернуть этот результат (или массив результатов) в пользовательский интерфейс (для правильного отображения и обработки)?

1) В DAL2 / Helper / TagNameTotal.cs (для примера)

2) В BLayer / Helpers / TagNameTotals.cs?

3) Ничего из вышеперечисленного? (или либо?)

Если вышеприведенное не true , о чем я неправильно думаю?

Разве это не нормально, когда кто-то хочет передать результат запроса в пользовательский интерфейс и изменить его? Скажем, в приведенном выше примере я хотел бы изменить TagName в пользовательском интерфейсе (возможно, это не лучший пример, но он применим).

Извините, но я все еще нахожу, что весь LINQ2SQL немного грубоват, когда он используется вне веб-проекта или простого приложения. Это основные вещи, которые мы делали с ADO.NET (и наборы записей до этого) навсегда.

Сделайте select / join / group / crazySQL, измените, передайте изменения обратно.

PLINQO хорош, потому что он избавляет от хлопот LINQ2SQL в его сырой форме (многие 2 многие, deatached, регенерация контекста, кеш и т. Д.), Но это все еще LINQ, поэтому должны применяться методы DLINQ.

Чего мне не хватает?

note : Не путайте PLinq с PLinqO.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Я ответил на этот пост в сообществе CodeSmith , однако я подумал об этом и наткнулся на этот пост. Вы можете найти в этом посте некоторую помощь

По сути, вы создаете мини-класс и используете оператор let , чтобы определить подмножество, а затем лениво загружать его, когда вам это нужно ....

0 голосов
/ 26 ноября 2009

Для меня это звучит как бесстыдная вилка для продукта PLinqO. Я надеюсь, что это не ваше намерение. Я посмотрел на PLinqO и, возможно, получил бы его, если бы вам не пришлось покупать CodeSmith. Нет, спасибо.

Я создал полнофункциональную 3-уровневую платформу с использованием L2S, и я столкнулся с проблемами, связанными с отношениями M: M, отсоединенными объектами (особенно с обновлениями), обработкой контекста и т. Д., Без использования PLinqO и других Сторонний инструмент. Это можно сделать, когда вы поймете, как работает L2S. Я думаю, что наше решение довольно элегантное, а производительность неплохая.

Для тех, кто читает это, если вы хотите потратить деньги на сторонние инструменты, инвестируйте в LinqPad и Linqer. Вы можете приобрести оба этих инструмента менее чем за 75 долларов США; они фантастические И я не связан ни с одним из них.

Randy

...