[英]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:
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,并且在WebArkadasCities
和WebArkadasTowns
之间定义了导航属性,则可以通过省略连接来大大简化 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.