0

我对此感到非常痛苦,我有一项任务,无法弄清楚如何使用 silverlight WCF Linq 服务。我有来自 Locations 表绑定到组合框的值,所以城市可以正确显示。在 SelectionChanged 事件中,我想将 location_name 传递给 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 没有显示任何错误,但它仍然没有运行......我没有想法

4

1 回答 1

2

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

这段代码:

(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)

为了表明您只希望从查询中返回一个元素,您可以使用FirstSingleFirstOrDefaultSingleOrDefault方法。

例如:

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(),我认为也可以将您的两个查询组合成一个调用......但我认为也许我们应该让基础工作然后从那里开始(遵循“让它工作,让更好”的口头禅)。

聚苯乙烯。使用 your DataContext,您可能应该考虑将其包装在using语句中,或者在完成使用后将其丢弃。


我不会做好这方面的工作,但这是(根据我有限的理解)在此响应中上面列出的方法First之间的关键区别:SingleOrDefault

  • First返回集合中的第一项,如果集合为空(零元素)则抛出异常
  • FirstOrDefault如果集合为空(零元素),则返回集合中的第一项或 null
  • Single返回集合中唯一的项目,如果集合中没有一个项目,则抛出异常
  • SingleOrDefault返回集合中的第一项,如果集合为空(零元素)则返回 null,如果集合有超过 1 个元素则抛出异常
于 2013-03-28T00:27:38.573 回答