Использование SQL вместо LINQ в Telerik Open Access

Я использую Telerik Open Access. У меня есть два отдельных проекта с данными открытого доступа, а затем третий проект, содержащий большую часть моего кода. Я работал над способом преобразования простого (по крайней мере, я так думал) SQL-запроса в LINQ, чтобы я мог получить нужные мне данные. Я не добился успеха. Мне пришлось разбить один запрос LINQ на отдельные запросы из-за необходимости функции Trim() (я думаю). Это привело к длинному фрагменту кода, и я все еще не получаю тех же результатов, что и мой SQL-запрос.

Итак, мой вопрос: можно ли использовать SQL вместо LINQ для доступа к данным в проектах открытого доступа? Если да, можете ли вы показать мне синтаксис для моего запроса?

Если невозможно использовать SQL, можете ли вы показать мне, как правильно преобразовать мой SQL-запрос в LINQ, чтобы я получил те же результаты?

Спасибо.

Мой SQL-запрос

SELECT DISTINCT us2.ccustno, us2.dispname, us2.csiteno, so.s1_name
FROM [DALubeDeacom].[dbo].[dmbill] bi
      INNER JOIN [DALubeDeacom].[dbo].[dmso1] so
            ON bi.bi_s1id = so.s1_id
      INNER JOIN [DALubeNew].[dbo].[usersecurity] us2
            ON so.s1_name = us2.cparentno
WHERE
        us2.ctype = 'JOBSITE'
    AND us2.csiteno is not null
    AND us2.csiteno != ''
    AND bi.bi_smid = '22'
ORDER BY us2.csiteno

Мой запрос LINQ

public List<DataModelSample> GetLocationsBySalesNo(string salesNo)
        {
            int iSalesNo = int.Parse(salesNo.Trim());
            try
            {
                var dmso = (
                    from so in deacom.Dmso1
                    join qt in deacom.Dmbills
                        on so.S1_id equals qt.Bi_s1id
                    where qt.Bi_smid == iSalesNo
                    select new Dmso1
                    {
                        S1_id = so.S1_id
                        , S1_name = so.S1_name.Trim()

                    }
                    );

                    var usec = (
                    from us in dbContext.Usersecurities
                    where us.Cparentno != null && us.Cparentno.Trim() != ""     && us.Ctype.Trim() == "JOBSITE" && us.Csiteno.Trim() != ""
                    select new Usersecurity
                    {
                        Ccustno = us.Ccustno.Trim(),
                        Csiteno = us.Csiteno.Trim(),
                        Dispname = us.Dispname.Trim(),
                        Cparentno = us.Cparentno.Trim()
                    }
                    );

                    var customers =
                    (
                        from us in usec
                        join so in dmso
                        on us.Cparentno equals so.S1_name
                        select us
                    );

                    customers = customers.GroupBy(x => x.Csiteno).Select(x => x.First());

                    List<DataModelSample> listLocations =
                        (
                            from c in customers
                            select new DataModelSample
                            {
                                customerID = c.Ccustno
                                ,
                                origLocationName = c.Csiteno + " " + c.Dispname
                                ,
                                origLocationID = c.Csiteno
                            }
                        ).OrderBy(x => x.origLocationID).ToList();

                return listLocations.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        } // GetLocationsBySalesNo(userInfo.csalesno)

Редактировать 1 - 2-19-16

Попробовал предложение ViktorZ. Его запрос был похож на тот, который я впервые попробовал. Он вернул ошибку «Идентификатор« Ctype »не является параметром, переменной или полем« DALube_DeacomModel.Dmbill ». Если« Ctype »является свойством, добавьте к нему атрибут FieldAlias ​​или Storage или объявите его как псевдоним поля». Из онлайн-поиска казалось, что это было сделано для «расширенных полей». Кажется, я не использую такие поля. Единственный способ обойти эту ошибку — разбить ее на более мелкие запросы LINQ в моем исходном вопросе, что не дало правильных результатов. Какие-либо предложения?

Вот код:

var query = (from bill in deacom.Dmbills
            join so in deacom.Dmso1 on bill.Bi_s1id equals so.S1_id
            join us in dbContext.Usersecurities on so.S1_name equals us.Cparentno
            where us.Ctype == "JOBSITE"
                && us.Csiteno != null
                && us.Csiteno != string.Empty
                && bill.Bi_smid == iSalesNo
            select new
            {
                ccustno = us.Ccustno.Trim(),
                dispname = us.Dispname.Trim(),
                csiteno = us.Csiteno.Trim(),
                s1_name = so.S1_name.Trim()
            }).Distinct();

person boilers222    schedule 18.02.2016    source источник


Ответы (1)


Одно очень грубое приближение вашего SQL-запроса:

    var query = (from bill in deacom.Bills
            join so in deacom.LubeDeacom on bill.bi_s1id equals so.s1_id
            join us in deacom.UserSecurity on so.s1_name equals us.cparentno
            where us.ctype = "JOBSITE"
                && us.csiteno != null
                && us.csiteno != string.Empty
                && bill.smid = '22'
            order by us.csiteno
            select new
            {
                us.ccustno.Trim(),
                us.dispname.Trim(),
                us.csiteno.Trim(),
                so.s1_name.Trim()
            }).Distinct();

// to check the translation result
string sql = query.ToString()
// to get the results
var result = query.ToList()

Если это не работает для вас, вы всегда можете вернуться к Telerik Data Access ADO.NET API. Вот статья документации как его использовать.

person ViktorZ    schedule 19.02.2016
comment
Спасибо ВикторЗ. Я собираюсь поработать над этим сегодня и вернуться к вам. Я думаю, что моя первоначальная попытка LINQ была похожа на эту. Я столкнулся с проблемой, потому что в so.s1_name были пробелы в конце, поэтому мне пришлось использовать функцию обрезки. В этот момент я получил ошибки и решил разбить его на несколько запросов LINQ, чтобы сначала обрезать пробелы. Меня интересует ссылка на Telerik, которую вы мне прислали. Моя компания начала использовать Telerk Open Access без какого-либо обучения, и мне сказали использовать LINQ. Я вижу, что вы отправили ссылку для доступа к данным Telerik. Это условия для одного и того же продукта Telerik? - person boilers222; 19.02.2016
comment
ViktorZ Попробовал ваш запрос и получил ту же ошибку, что и при попытке написать его: Идентификатор 'Ctype' не является параметром, переменной или полем 'DALube_DeacomModel.Dmbill'. Если «Ctype» является свойством, добавьте к нему атрибут FieldAlias ​​или Storage или объявите его как псевдоним поля. Очевидно, что ctype не является переменной в dmbill, и я этого не хочу. Какие-либо предложения? - person boilers222; 19.02.2016
comment
Telerik Data Access — это тот же продукт, что и Telerik OpenAccess (за исключением новых функций и исправлений ошибок, накопленных за это время). В какой-то момент он был переименован с новым названием и зеленым значком вместо оригинального оранжевого. - person ViktorZ; 19.02.2016
comment
Вы должны убедиться, что таблица Dmbill сопоставлена ​​с постоянным классом, а затем вам нужно найти свойство, соответствующее столбцу ctype. Используйте имя свойства (и сопоставленные имена классов) в запросе LINQ. Если он не сопоставлен, см. документацию по продукту, как выполнить сопоставление. Вы также можете ознакомиться с руководством по началу работы в docs. telerik.com/data-access/getting-started/. - person ViktorZ; 19.02.2016
comment
Спасибо ВикторЗ. Боюсь, я не понимаю вашего ответа. ctype находится не в Dmbill, а в другой таблице с именем usersecurity. Я ни в коем случае не хочу делать вывод, что ctype находится в dmbill или сопоставлять usersecurity.ctype с каким-либо полем в dmbill. Между dmbill и usersecurity не должно быть сопоставления, поэтому я не уверен, какое сопоставление мне нужно добавить. Можете вы помочь мне? - person boilers222; 19.02.2016