在 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();

在 Telerik Open Access 中使用 SQL 而不是 LINQ

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。这是一篇如何使用它的文档文章。