Я использую 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();