0

问题 我正在用我之前制作的程序在这里尝试一些新的东西。在第一个程序中,我能够拖放表适配器并使用通用“var”来存储查询结果。现在我正在尝试创建一个具有一些代码分离的新程序。例如,在第一个程序中,我将所有代码都写在 form.cs 文件中,这次我想创建一个类来运行查询并将它们返回给调用类,但是,如何存储查询结果包含多种类型?您不能返回 var 变量,它必须更具体。我在选择行上收到错误消息:“无法将类型'System.Collections.Generic.IEnumerable' 隐式转换为'System.Collections.Generic.IEnumerable;。存在显式转换(您是否缺少演员表?)

有人能帮我吗?演员阵容是什么?第一种方法 (public IEnumerable getList()) 按预期工作,它的第二种方法 (public IEnumerable getRecipeInfo(string recipeName)) 出现错误。到目前为止,这是我的代码。

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

...给你一个匿名类型的 IEnumerable,它有 6 个值,可能是所有字符串。var不代表“变体”并且仍然是强类型声明,只是在编译时解析(如果无法从使用中推断出类型,则会失败)。因此,上面的代码在编译时var意味着意义IEnumerable<anonymous_type_with_6_strings>,但return语句试图这样做IEnumerable<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 回答