LINQ2SQL + PLINQO:Как справиться с такой простой ситуацией, как эта?

StackOverflow https://stackoverflow.com/questions/1803761

Вопрос

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

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

Теперь у меня уже есть мой DAL2 (я использую менеджеры).Это “работает”.Но у меня есть несколько сомнений.

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

select name,  Count(*) as Total from SomeTable 

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

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

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

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

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

ТЕГ1, 33

ТЕГ2, 21

ТЕГ3, 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”)

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

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

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

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

2) В BLayer/Helpers/TagNameTotals.cs?

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

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

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

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

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

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

Что я упускаю из виду?

примечание:Не путайте PLinq с PLinqO.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Рэнди

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top