0

質問以前に作成したプログラムを使用して、ここで何か新しいことを試みています。最初のプログラムでは、テーブルアダプターをドラッグアンドドロップし、汎用の「var」を使用してクエリ結果を保存することができました。今、私はコードがいくらか分離された新しいプログラムを作成しようとしています。たとえば、最初のプログラムでは、すべてのコードをform.csファイルに記述しましたが、今回はクエリを実行して呼び出し元のクラスに返すクラスを作成したいと思いますが、クエリをどのように保存しますか多くのタイプを含む結果?var変数を返すことはできません。より具体的にする必要があります。選択行に次のようなエラーが表示されます。「タイプ'System.Collections.Generic.IEnumerable'を'System.Collections.Generic.IEnumerable;に暗黙的に変換できません。明示的な変換が存在します(キャストがありませんか?)

誰かが私を助けることができますか?キャストは何ですか?最初のメソッド(public IEnumerable getList())は期待どおりに機能し、2番目のメソッド(public IEnumerable getRecipeInfo(stringrecipeName))ではエラーが発生します。これが私のこれまでのコードです。

namespace recipeDataBase
{
    class Query
    {
        recipiesNewDataSet recipeDataSet = new recipiesNewDataSet();
        recipiesNewDataSetTableAdapters.RecipeTableAdapter recipeTableAdapter = new recipiesNewDataSetTableAdapters.RecipeTableAdapter();
        recipiesNewDataSetTableAdapters.RecipeIngredientTableAdapter ingredientTableAdapter = new recipiesNewDataSetTableAdapters.RecipeIngredientTableAdapter();
        recipiesNewDataSetTableAdapters.RatingTableAdapter ratingTableAdapter = new recipiesNewDataSetTableAdapters.RatingTableAdapter();

        public  Query()
        {

        }

        public IEnumerable<string> getList()
        {
            recipeTableAdapter.Fill(recipeDataSet.Recipe);

            IEnumerable<string> recipeList = (from a in recipeDataSet.Recipe
                                              select a.RecipeName);
            return recipeList;
        }

        public IEnumerable<string> getRecipeInfo(string recipeName)
        {
            recipeTableAdapter.Fill(recipeDataSet.Recipe);
            ratingTableAdapter.Fill(recipeDataSet.Rating);
            ingredientTableAdapter.Fill(recipeDataSet.RecipeIngredient);
            IEnumerable<string> recipeInfo = (from a in recipeDataSet.Recipe
                                              from b in recipeDataSet.Rating
                                              from c in recipeDataSet.RecipeIngredient
                                              where a.RecipeName == recipeName &&
                                              a.RecipeNum == c.RecipeNum &&
                                              a.RatingNum == b.RatingNum
                                              select new { a.RecipeName, a.Nationality, a.Event, a.Source, b.FamilyRating, c.Ingredient });
            return recipeInfo;
        }

    }
}

助けてくれてありがとう!

4

2 に答える 2

1

クエリで匿名型を選択したが、クエリ変数の型が。であるため、例外が発生しますIEnumerable<string>。代わりに、文字列を選択するか、varキーワードまたはカスタムクラスを使用する必要があります。

何か便利なものを返したい場合は、匿名タイプで選択したこれらすべてのプロパティを使用してカスタムクラスを作成します。次に例を示します。

public class Recipe
{
    public String RecipeName{ get; set;}
    public String Nationality{ get; set;}
    public String Event{ get; set;}
    // ...
}

次にIEnumerable<Recipe>、メソッドから代わりに戻り、クエリでインスタンスを選択できます。

...
select new Recipe(){ RecipeName=a.RecipeName, Nationality=a.Nationality, Event=a.Event,... });

補足:クエリではJoinなく、を使用することをお勧めします。Where

LINQ JOINがWHEREとのリンクよりもはるかに高速なのはなぜですか?

于 2012-10-19T22:02:26.800 に答える
0

匿名タイプを使用しているので、次のようになります。

        var recipeInfo = (from a in recipeDataSet.Recipe
                                          from b in recipeDataSet.Rating
                                          from c in recipeDataSet.RecipeIngredient
                                          where a.RecipeName == recipeName &&
                                          a.RecipeNum == c.RecipeNum &&
                                          a.RatingNum == b.RatingNum
                                          select new { a.RecipeName, a.Nationality, a.Event, a.Source, b.FamilyRating, c.Ingredient }).ToList();

... 6つの値(場合によってはすべての文字列)を持つ匿名型のIEnumerableを提供します。var「バリアント」を表すのではなく、厳密に型指定された宣言であり、コンパイル時に解決されるだけです(使用法から型を推測できない場合は失敗します)。したがって、上記のコードはコンパイル時にvar意味がありますが、ステートメントはこれを作成しようとします-これは、コンパイル時のキャスト例外が発生する場所です。IEnumerable<anonymous_type_with_6_strings>returnIEnumerable<string>

RecipeInfo値を保持する単純なクラスを作成して、メソッドが次を返すようにすることをお勧めしますIEnumerable<RecipeInfo>

class RecipeInfo
{
    public string RecipeName {get;set;}
    public string Nationality {get;set;}
    public string Event {get;set;}
    public string Source {get;set;}
    public string FamilyRating {get;set;}
    public string Ingredient {get;set;}
}

そして、あなたはあなたの選択をこのタイプに投影することができます:

    var recipeInfo = (from a in recipeDataSet.Recipe
                                      from b in recipeDataSet.Rating
                                      from c in recipeDataSet.RecipeIngredient
                                      where a.RecipeName == recipeName &&
                                      a.RecipeNum == c.RecipeNum &&
                                      a.RatingNum == b.RatingNum
                                      select new RecipeInfo{RecipeName=a.RecipeName, Nationality=a.Nationality, Event=a.Event, Source=a.Source, FamilyRating=b.FamilyRating, Ingredient=c.Ingredient }).ToList();
于 2012-10-19T22:34:25.520 に答える