我想知道为什么它会在我下面的代码中返回一个空值:
using (var context = new MusicStoreDBEntities())
{
var bay = (from g in context.stringInstrumentItems
where g.brand.name == name.Text select g)
.FirstOrDefault();
context.stringInstrumentItems.Remove(bay);
context.SaveChanges();
}
var bay返回null。我做错了什么?这是我试图变成实体框架的等效原始sql查询:
string queryGuitarItems = "DELETE S FROM stringInstrumentItem S JOIN brand B ON S.brandId = B.brandId WHERE B.name = @brand";
using (SqlConnection connectionGuitarItems = new SqlConnection(ConfigurationManager.ConnectionStrings["musicStoreConnection"].ToString()))
{
using (SqlCommand commandGuitarItems = new SqlCommand(queryGuitarItems, connectionGuitarItems))
{
connectionGuitarItems.Open();
commandGuitarItems.Connection = connectionGuitarItems;
commandGuitarItems.Parameters.Add(new SqlParameter("@brand", name.Text));
commandGuitarItems.ExecuteNonQuery();
connectionGuitarItems.Close();
commandGuitarItems.Parameters.Clear();
}
}
如果两个查询相似或不相同,请告诉我。我真的试图将所有原始sql查询更改为实体框架,这是一个开始。
答案 0 :(得分:1)
您尚未在linq查询中包含您的联接。由于您尚未包含Brand
,因此根据您的where
条款未获取任何记录。
由于您正在使用实体框架,您可以尝试这样的事情:
using System.Data.Entities;
using (var context = new MusicStoreDBEntities())
{
var bay = context.stringInstrumentItems.Include(i => i.brand)
.FirstOrDefault(x => x.brand.name == name.Text);
if (bay != null)
{
context.stringInstrumentItems.Remove(bay);
context.SaveChanges();
}
}
.Include()
从数据库获取相关brand
记录的方式与JOIN在SQL代码中的记录相同,因此您现在应该有一条记录。
排除它的问题与连接两侧没有匹配记录的问题相同 - 查询不会选择任何记录。