C# C Silverlight WCF Linq服务从MSQL数据库中选择

C# C Silverlight WCF Linq服务从MSQL数据库中选择,c#,sql-server,wcf,linq,silverlight,C#,Sql Server,Wcf,Linq,Silverlight,我有一个可怕的时间与此,我有一个任务,不能想出如何工作的silverlight WCF Linq服务。我将位置表中的值绑定到一个组合框,这样可以正确显示城市。在SelectionChanged事件中,我想将位置名称传递给GetWeather函数,并显示另一个表中的相关天气。我不知道如何使用location_name来选择相关的P_id,它作为location_id出现在天气表中,然后从相关location_id中显示天气 这是我到目前为止的代码。。。但它不起作用。。。我只是希望它很简单,因为c根

我有一个可怕的时间与此,我有一个任务,不能想出如何工作的silverlight WCF Linq服务。我将位置表中的值绑定到一个组合框,这样可以正确显示城市。在SelectionChanged事件中,我想将位置名称传递给GetWeather函数,并显示另一个表中的相关天气。我不知道如何使用location_name来选择相关的P_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未显示任何错误,但它未仍在运行。。。我没有主意了

我不确定这是不是真的,但我注意到了一些事情:

此代码:

(from o in a.locations where o.location_name == location_name select o.P_Id)
实际上返回一个,而不是一个项目,因此当您尝试在中使用它时,它可能无法正常工作:

(from o in a.weathers where o.location_id.Equals(identity) select o.weather)
为了指示您只希望从查询返回一个元素,可以使用、或方法

例如:

var identity = (from o in a.locations where o.location_name == location_name select o.P_Id).Single();
我会快速阅读First、FirstOrDefault等每个方法,看看哪一个适合您的用例,但如果您确定将得到1个结果,即位置名称在数据库中是唯一的,那么使用Single应该可以

这将获取我假定为整数类型的标识,您可以在以下查询中使用该标识:

var weatherType = (from o in a.weathers where o.location_id == identity select o.weather).Single();
为了得到一条记录,我在这里假设o.weather,即数据库中类/列中的weather属性是一个字符串,并且您只需要/期望一条记录

也许可以试一试

另外,阅读GetWeather方法中的查询,我认为也有可能将两个查询合并到一个调用中……但我认为也许我们应该让基础工作起来,然后按照“让它工作,让它更好”的咒语从那里开始

PPS。使用DATACONTRONT,您应该考虑在使用语句中包装它,或者在使用完之后使用它。否则,

我不打算在这方面做得很好,但我有限地了解了上面在回答中列出的第一种、单一或默认方法之间的关键区别:

First返回集合中的第一项,如果集合为空的零元素,则引发异常 FirstOrDefault返回集合中的第一项,如果集合为空,则返回null Single返回集合中唯一的项,如果集合中没有一个项,则引发异常 SingleOrDefault返回集合中的第一项,如果集合为空,则返回null;如果集合中有多个元素,则抛出异常
Linq总是返回一个集合;要获取TOP1,请检查返回值是否为null,然后获取其中的第一项。在您的情况下,first select将返回一个IEnumerable,它不能等于string。在调用single之前不要忘记检查null:谢谢,这让我了解了很多。