我有一个可怕的时间,我有一个任务,无法弄清楚如何工作Silverlight WCF Linq服务。我有一个Locations表中绑定到组合框的值,所以城市正确显示。在SelectionChanged事件上,我想将location_name传递给GetWeather()函数,并显示另一个表中的相关天气。我无法确定如何使用location_name选择相关的P_id,它在weather_id中作为location_id,然后显示相关location_id的天气。
这是我到目前为止的代码......但它不起作用......我只是希望它很简单,因为c#根本不是我的包。
我的GetWeather()函数的ServiceReference文件是
[OperationContract]
public string GetWeather(string location_name)
{
DataClasses1DataContext a = new DataClasses1DataContext();
var identity = (from o in a.locations
where o.location_name == location_name
select o.P_Id);
var weatherType = (from o in a.weathers
where o.location_id.Equals(identity)
select o.weather).ToString();
return weatherType;
}
主C#页面的代码在这里......我做错了什么......
private void location_cmb_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
a.GetWeatherCompleted += new EventHandler<GetWeatherCompletedEventArgs>(a_GetWeatherCompleted);
a.GetWeatherAsync(location_cmb.SelectedItem.ToString());
}
void a_GetWeatherCompleted(object sender, GetWeatherCompletedEventArgs e)
{
textBlock2.Text = e.Result;
}
Visual Studio没有显示任何错误,但它仍未运行...我没有想法
答案 0 :(得分:2)
我不确定这是不是,但我注意到了一些事情:
此代码:
(from o in a.locations where o.location_name == location_name select o.P_Id)
实际上会返回collection,而不是单个项目,因此当您尝试使用它时,它可能无法正常工作:
(from o in a.weathers where o.location_id.Equals(identity) select o.weather)
为了表明您只想从查询中返回一个元素,您可以使用First,Single,FirstOrDefault或SingleOrDefault方法。
例如:
var identity = (from o in a.locations where o.location_name == location_name select o.P_Id).Single();
我会快速阅读每个方法(First,FirstOrDefault等)以查看哪个方法适合您的用例,但如果您确定将获得1个结果(即location_name在您的数据库中是唯一的),那么使用Single()应该没问题。
这会得到identity
(我假设它是一个整数类型),您可以在以下查询中使用它:
var weatherType = (from o in a.weathers where o.location_id == identity select o.weather).Single();
要获取单个记录...我在这里假设o.weather(即数据库中类/列中的weather
属性)是一个字符串,您只需要/期望一个记录。
或许试一试?
PS。在GetWeather()
方法中阅读您的查询,我认为也可以将您的两个查询合并为一个调用...但我想也许我们应该得到基地工作,然后从那里开始(遵循“让它工作,让它变得更好”的口头禅)。
PPS。使用DataContext
,您应该考虑将其包含在using
语句中,或者在您完成工作后将其disposing包裹起来它
我不打算做好这件事,但这是(根据我的有限理解)这个响应中上面列出的First
,SingleOrDefault
方法之间的关键区别:< / p>
First
返回集合中的第一项,如果集合为空(零元素),则抛出异常FirstOrDefault
返回集合中的第一项,如果集合为空(零元素)Single
返回集合中唯一的项目,如果集合中没有一个项目,则会抛出异常SingleOrDefault
返回集合中的第一个项目,如果集合为空(零元素),则返回null;如果集合具有多个元素,则返回异常