繁体   English   中英

帮助将 SQL 查询转换为 LINQ 查询

[英]Assistance converting SQL query to a LINQ query

他们告诉我用 LINQ 编写我用 SQL 查询编写的代码。 但我完全做不到。 知道的人可以帮帮我吗?

我的 SQL 代码:

        DropDownListInvoiceTown.Items.Clear();
        Session["ilID"] = Convert.ToInt32(DropDownListInvoiceCity.SelectedValue);
        SqlConnection cnn = new SqlConnection(@"Data Source = ENKITEST; Initial Catalog = FAZIKI; User ID = WebAdmin; Password = !ConAdmin");
        SqlCommand kmt = new SqlCommand();
        kmt.Connection = cnn;
        kmt.CommandText = "SELECT wt.IDTown as IlceID, wt.TownName as IlceAdi FROM ArkadasWebSite.dbo.WebArkadasCities as wc JOIN ArkadasWebSite.dbo.WebArkadasTowns as wt on wc.IDCity = wt.IDTown WHERE wc.IDCity=@DropDownListInvoiceCity ORDER BY wc.CityName";
        kmt.Parameters.AddWithValue("@DropDownListInvoiceCity", DropDownListInvoiceCity.SelectedValue);
        SqlDataReader oku;
        cnn.Open();
        oku = kmt.ExecuteReader();
        DropDownListInvoiceTown.DataSource = oku;
        DropDownListInvoiceTown.DataValueField = "IlceID";
        DropDownListInvoiceTown.DataTextField = "IlceAdi";
        DropDownListInvoiceTown.DataBind();
        cnn.Close();

如果我修复的代码是:

   DropDownListInvoiceTown.Items.Clear();
            Session["ilID"] = Convert.ToInt32(DropDownListInvoiceCity.SelectedValue);
            DropDownListInvoiceTown.DataSource = arkadas.WebArkadasCities.Where(x => x.IDCity == arkadas.WebArkadasTowns.Where(w => w.IDTown == DropDownListInvoiceCity.SelectedValue).Select(w => w.TownName).FirstOrDefault()).Select(x => x.CityName).ToList();
            DropDownListInvoiceTown.DataValueField = "IlceID";
            DropDownListInvoiceTown.DataTextField = "IlceAdi";
            DropDownListInvoiceTown.DataBind();

但它不起作用,所以它返回空。 我该怎么做?

试试下面的查询

arkadas.WebArkadasCities
.Join(arkadas.WebArkadasTowns, wc=> wc.IDCity, wt=> wt.IDTown, (wc, wt) => new {wc, wt})
.where(x=> x.wt.IDCity==DropDownListInvoiceCity.SelectedValue)
.Select(s=> new 
{
IlceID=s.wt.IDTown,
IlceAdi=s.wt.TownName
}).OrderBy(o => o.IlceID).ToList();

最终我们希望将 SQL 表达式转换为 LINQ 表达式。 此答案假定您使用的是 ORM 或至少是 LINQ to SQL,并且原始 SQL 是返回预期记录集的正确语句。

  • 如果原始 SQL 不正确,则此 LINQ 解决方案将无济于事,而是有关如何将 SQL 转换为 LINQ 的一般指南。

鉴于此 SQL:

SELECT wt.IDTown as IlceID, wt.TownName as IlceAdi 
FROM ArkadasWebSite.dbo.WebArkadasCities as wc 
JOIN ArkadasWebSite.dbo.WebArkadasTowns as wt on wc.IDCity = wt.IDTown 
WHERE wc.IDCity=@DropDownListInvoiceCity 
ORDER BY wc.CityName

他们告诉我用 LINQ 写我用 SQL 查询写的代码

Linq 有一个可以使用的查询表示法,它与 SQL 非常相似,您可以看到以下是原始查询的直接转换,主要需要注意的是子句的顺序不同,并且语法围绕 a 交换位,但对于精通 SQL 的人来说,它非常容易识别。

var linqQuery = from wc in arkadas.WebArkadasCities
                where wc.IDCity == DropDownListInvoiceCity.SelectedValue                 
                join wt in arkadas.WebArkadasTowns on wc.IDCity equals wt.IDTown
                order by wc.CityName
                select new {
                    IlceID = wt.IDTown,
                    IlceAdi = wt.TownName
                };

可以使用 linq fluent表示法编写相同的查询:

var linqQuery = arkadas.WebArkadasCities.Where(wc => wc.IDCity == DropDownListInvoiceCity.SelectedValue)
                                        .Join(arkadas.WebArkadasTowns, wc => wc.IDCity, wt => wt.IDTown, (wc, wt) => new 
                                            {
                                                wt.IDTown,
                                                wt.TownName,
                                                wc.CityName
                                            })
                                        .OrderBy(x => x.CityName)
                                        .Select(x => new 
                                            {
                                                IlceID = x.IDTown,
                                                IlceAdi = x.TownName
                                            });

然后你可以使用这个linqQuery参考,但是你选择在你的原始代码中定义它:

DropDownListInvoiceTown.Items.Clear();
Session["ilID"] = Convert.ToInt32(DropDownListInvoiceCity.SelectedValue);
DropDownListInvoiceTown.DataSource = linqQuery.ToList();
DropDownListInvoiceTown.DataValueField = "IlceID";
DropDownListInvoiceTown.DataTextField = "IlceAdi";
DropDownListInvoiceTown.DataBind();

如果您使用的是 ORM,并且在WebArkadasCitiesWebArkadasTowns之间定义了导航属性,则可以通过省略连接来大大简化 linq 查询。

以下查询对您的模型做出了可能不存在的假设,在这种情况下,我们假设WebArkadasTowns有一个名为City的导航属性,它将城镇链接到它们所属的城市 在这个例子中,假设每个城市有多个城镇

这个假设基于城镇小于城市的普遍预期,它符合我的当地环境,其中城镇称为郊区,城市称为直辖市(或

在这种情况下,我们还将转置查询以从WebArkadasTowns进行选择,因为这会使查询更清晰。 由于导航属性,我保留了原始查询中自动为我们定义的工件。

查询符号:

var linqQuery = //from wc in arkadas.WebArkadasCities
                from wt in arkadas.WebArkadasTowns// on wc.IDCity equals wt.IDTown
                where wt.City.IDCity == DropDownListInvoiceCity.SelectedValue 
                order by wt.City.CityName
                select new {
                    IlceID = wt.IDTown,
                    IlceAdi = wt.TownName
                };

流利的符号:

var linqQuery = arkadas.WebArkadasTowns.Where(wt => wt.City.IDCity == DropDownListInvoiceCity.SelectedValue)
                                       .OrderBy(wt => wt.City.CityName)
                                       .Select(wt => new 
                                            {
                                                IlceID = wt.IDTown,
                                                IlceAdi = wt.TownName
                                            });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM