0

私はこれで恐ろしい時間を過ごしています。割り当てがあり、シルバーライトの 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)

クエリから 1 つの要素のみを返すように指定するには、FirstSingleFirstOrDefaultまたは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()と、2 つのクエリを 1 つの呼び出しに結合することも可能だと思います...しかし、おそらくベースを機能させてから、そこから移動する必要があると思います ("make it work, makeそれはより良い」マントラ)。

PPS。の場合は、ステートメントDataContextでラップするか、作業が終了したら破棄することを検討する必要があります。using


私はこれをうまくやるつもりはありませんが、(私の限られた理解から)これらの主な差別化要因はFirst次のSingleOrDefaultとおりです。

  • Firstコレクション内の最初のアイテムを返すか、コレクションが空 (ゼロ要素) の場合は例外をスローします
  • FirstOrDefaultコレクション内の最初の項目を返すか、コレクションが空 (ゼロ要素) の場合は null を返します
  • Singleコレクション内の唯一の項目を返すか、コレクションに項目が 1 つだけない場合は例外をスローします
  • SingleOrDefaultコレクション内の最初の項目を返します。コレクションが空 (要素がない) の場合は null を返し、コレクションに複数の要素がある場合は例外をスローします。
于 2013-03-28T00:27:38.573 に答える