Как использовать LINQ Для SQL в Решении N-Tier?

Я работал вокруг и манипулировал dimensions_html вместо этого, чтобы включить все необходимые измерения. Это не элегантное и не универсальное решение, но работает для меня прямо сейчас.

// functions.php
add_filter( 'woocommerce_format_dimensions', 'change_formated_product_dimentions', 10, 2 );
function change_formated_product_dimentions( $dimension_string, $dimensions ){
    global $product;
    $cm = get_option( 'woocommerce_dimension_unit' );

    $html = '';

    if( $dimensions['length'] ){
        $html .= '<span><strong>Length</strong> '.$dimensions['length'].' '.$cm.'</span>';
    }

    if( $dimensions['width'] ){
        $html .= '<span><strong>Width</strong> '.$dimensions['width'].' '.$cm.'</span>';
    }

    if( $dimensions['height'] ){
        $html .= '<span><strong>Height</strong> '.$dimensions['height'].' '.$cm.'</span>';
    }

    $depth = $product->get_meta( '_depth' );
    if( $depth ){
        $html .= '<span><strong>Depth</strong> '.$depth.' '.$cm.'</span>';
    }

    $diameter = $product->get_meta( '_diameter' );
    if( $diameter ){
        $html .= '<span><strong>Diameter</strong> '.$diameter.' '.$cm.'</span>';
    }

    $seat_height = $product->get_meta( '_seat_height' );
    if( $seat ){
        $html .= '<span><strong>Seat height</strong> '.$seat_height.' '.$cm.'</span>';
    }

    return $html;
}

Это теперь включено в $product['dimensions_html'] и, когда отражается, приводит к

Длина 1 см Ширина 1 см Высота ] 1 см Глубина 1 см Диаметр 1 см Высота сиденья 1 см

и что (почти) именно то, что я хотел.

15
задан Giovanni Galbo 1 September 2008 в 14:37
поделиться

7 ответов

LINQ к SQL действительно не имеет n-tier истории, что я видел, так как объекты, которые он создает, создаются в классе с остальной частью его, у Вас действительно нет блока, на который можно приятно сослаться через что-то как веб-сервисы, и т.д.

единственный способ, которым я действительно полагал бы, что он использует datacontext, чтобы выбрать данные, затем заполнить посредническую модель данных, передавая это через, и ссылаясь на него с обеих сторон, и использование, что в стороне клиента - затем пасование назад их и продвижение данных назад в новый Datacontext или разумно обновление строк после перевыборки их.

Это - то, если я понимаю то, что Вы пытаетесь достигнуть: \

я спросил ScottGu тот же вопрос относительно его блога, когда я сначала начал смотреть на него - но я не видел единственный сценарий или приложение в дикой природе, которая использует LINQ для SQL таким образом. Веб-сайты как Витрина Rob Connery ближе к поставщику.

1
ответ дан 1 December 2019 в 05:23
поделиться

Гм, Рокфордский печальный Lhotka, что LINQ к SQL является замечательной технологией для выбирающих данных из базы данных. Он предполагает, что впоследствии они будут, должен, чтобы быть связать для "достижения объектов области" (иначе. CSLA objetcs).

Серьезно говорящий, LINQ к SQL имел, это - поддержка n-tier архитектуры, см. DataContext. Обновление метод.

1
ответ дан 1 December 2019 в 05:23
поделиться

Вы могли бы хотеть изучить ADO.Net Entity Framework как альтернатива LINQ к SQL, хотя это действительно поддерживает LINQ также. Я полагаю, что LINQ к SQL разработан, чтобы быть довольно легким и простым, тогда как Платформа Объекта является более мощной и вероятно более подходит в приложениях крупного предприятия.

1
ответ дан 1 December 2019 в 05:23
поделиться

Хорошо, я собираюсь дать мне одно возможное решение.

Вставляет/Обновляет, никогда не была проблема; можно перенести бизнес-логику в Сохранить/Обновить метод; например,

public class EmployeesDAL
{
    ...
    SaveEmployee(Employee employee)
    {
        //data formatting
        employee.FirstName = employee.FirstName.Trim();
        employee.LastName = employee.LastName.Trim();

        //business rules
        if(employee.FirstName.Length > 0 && employee.LastName.Length > 0)
        {
            MyCompanyContext context = new MyCompanyContext();

            //insert
            if(employee.empid == 0)
             context.Employees.InsertOnSubmit(employee);
            else
            {
              //update goes here
            }

            context.SubmitChanges();


        }
        else 
          throw new BusinessRuleException("Employees must have first and last names");
     }
 }

Для выбирающих данных или по крайней мере выборки данных, которые прибывают больше чем из одной таблицы, можно использовать хранимые процедуры или представления, потому что результаты не будут анонимными, таким образом, можно будет возвратить их из внешнего метода. Например, с помощью сохраненного proc:

    public ISingleResult<GetEmployeesAndManagersResult> LoadEmployeesAndManagers()
    {
        MyCompanyContext context = new MyCompanyContext();

        var emps = context.GetEmployeesAndManagers();

        return emps;
    }
1
ответ дан 1 December 2019 в 05:23
поделиться

Серьезно говорящий, LINQ к SQL имел, это - поддержка n-tier архитектуры, посмотрите DataContext. Метод обновления

Часть из того, что я считал, предполагает, что бизнес-логика переносит DataContext - другими словами, Вы переносите обновление в способ, которым Вы предлагаете.

способ, которым я традиционно пишу бизнес-объекты я обычно, инкапсулирует "Методы загрузки" в ФИЛИАЛЕ также; таким образом, у меня мог бы быть метод под названием LoadEmployeesAndManagers, который возвращает список сотрудников и их непосредственных менеджеров (это - изобретенный пример). Возможно, его просто меня, но в моем фронтэнде я видел бы e. LoadEmployeesAndManagers (), чем некоторый длинный оператор LINQ.

Так или иначе, с помощью LINQ это, вероятно, выглядело бы примерно так (не проверенный на правильность синтаксиса):

var emps = from e in Employees
                join m in Employees
                on e.ManagerEmpID equals m.EmpID
                select new
                          { e,
                            m.FullName
                          };

Теперь, если я понимаю вещи правильно, если я вставил, это говорит, что библиотека классов и называет его от моего фронтэнда, единственный способ, которым я могу возвратиться, это как IEnumerable, таким образом, я теряю свое сильное введенное совершенство. Единственным путем я смог бы возвратиться, объект со строгим контролем типов будет состоять в том, чтобы создать мой собственный класс Сотрудников (плюс строковое поле для имени менеджера) и заполнить его от результатов моего LINQ к SQL-оператору и затем возвратить это. Но это кажется счетчиком, интуитивным..., что точно сделало LINQ к SQL, покупают меня, если я должен сделать все это?

я думаю, что мог бы смотреть на вещи неправильный путь; любое просвещение ценилось бы.

0
ответ дан 1 December 2019 в 05:23
поделиться

"единственный способ, которым я могу возвратить это, как IEnumerable, таким образом, я теряю свое сильное введенное совершенство"

, который является неправильным. На самом деле Ваш запрос со строгим контролем типов, это - просто анонимный тип. Я думаю запрос, который Вы хотите, больше похож:

var emps = from e in Employees
            join m in Employees
            on e.ManagerEmpID equals m.EmpID
            select new Employee
                      { e,
                        m.FullName
                      };

, Который возвратит IEnumerable.

Вот статья , которую я записал по теме.

Linq-to-sql является ORM. Это не влияет на способ, которым Вы разрабатываете приложение N-tiered. Вы используете его тот же способ, которым Вы использовали бы любой другой ORM.

0
ответ дан 1 December 2019 в 05:23
поделиться

@liammclennan

, Который возвратит IEnumerable.... Linq-to-sql является ORM. Это не влияет на способ, которым Вы разрабатываете приложение N-tiered. Вы используете его тот же способ, которым Вы использовали бы любой другой ORM.

Затем я предполагаю, что все еще смущен. Да, Linq-to-Sql является ORM; но насколько я могу сказать, что все еще замусорил свой код фронтэнда встроенными операторами типа sql (linq, не sql...., но тем не менее я чувствую, что это должно быть абстрагировано далеко от фронтэнда).

предположим я переношу оператор LINQ, который мы использовали в качестве примера в методе. Насколько я могу сказать, единственный способ, которым я могу возвратиться, это - этот путь:

public class EmployeesDAL
{
    public IEnumerable LoadEmployeesAndManagers()
    {
            MyCompanyContext context = new MyCompanyContext();

            var emps = from e in context.Employees
            join m in context.Employees
            on e.ManagerEmpID equals m.EmpID
            select new
                      { e,
                        m.FullName
                      };

            return emps;
    }

}

От моего фронтэнда кодируют, я сделал бы что-то вроде этого:

EmployeesDAL dal = new EmployeesDAL;
var emps = dal.LoadEmployeesAndManagers();

Это, конечно, возвращает IEnumerable; но я не могу использовать, это как любой другой ORM как Вы говорит (если, конечно, я не неправильно понимаю), потому что я не могу сделать этого (снова, это - изобретенный пример):

txtEmployeeName.Text = emps[0].FullName

Это - то, под чем я подразумевал, "Я теряю сильное введенное совершенство". Я думаю, что начинаю соглашаться с Тиглем; тот LINQ-SQL не был разработан, чтобы использоваться таким образом. Снова, если я не вижу вещи правильно, кто-то показывает мне путь :)

0
ответ дан 1 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: