在 Telerik Open Access 中使用 SQL 而不是 LINQ
本文关键字:SQL LINQ Telerik Open Access | 更新日期: 2023-09-27 18:35:14
我正在使用Telerik Open Access。 我有两个单独的项目,其中包含开放访问数据,然后第三个项目包含我的大部分代码。 我一直在研究一种将简单(至少我认为是)SQL查询转换为LINQ的方法,以便我可以获取所需的数据。 我没有成功。 由于需要 Trim() 函数(我认为),我不得不将单个 LINQ 查询分解为单独的查询。 这导致了一段冗长的代码,我仍然没有得到与我的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();
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。这是一篇如何使用它的文档文章。