C# 如何将类型设置为IEnumerable<&燃气轮机;结果是否会有多种类型?

C# 如何将类型设置为IEnumerable<&燃气轮机;结果是否会有多种类型?,c#,linq,C#,Linq,问题我正在尝试一些新的东西,我以前做的一个程序。在第一个程序中,我能够拖放表适配器,并使用通用的“var”存储查询结果。现在我正在尝试创建一个新的程序,它有一些代码分离。例如,在第一个程序中,我将所有代码都写在form.cs文件中,这次我想创建一个类来运行查询并将其返回给调用类,但是,如何存储包含许多类型的查询结果?不能返回var变量,它必须更具体。我在选择行上得到一个错误,该错误为:“无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'Syst

问题我正在尝试一些新的东西,我以前做的一个程序。在第一个程序中,我能够拖放表适配器,并使用通用的“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;
        }

    }
}
命名空间recipeDataBase
{
类查询
{
recipiesNewDataSet recipeDataSet=新recipiesNewDataSet();
recipiesNewDataSetTableAdapters.RecipeTableAdapter RecipeTableAdapter=新recipiesNewDataSetTableAdapters.RecipeTableAdapter();
recipiesNewDataSetTableAdapters.RecipeIngredientTableAdapter ingredientTableAdapter=新recipiesNewDataSetTableAdapters.RecipeIngredientTableAdapter();
recipiesNewDataSetTableAdapters.RatingTableAdapter RatingTableAdapter=新recipiesNewDataSetTableAdapters.RatingTableAdapter();
公共查询()
{
}
公共IEnumerable getList()
{
RecipeDataAdapter.Fill(recipeDataSet.Recipe);
IEnumerable recipeList=(来自recipeDataSet.Recipe中的a)
选择a.RecipeName);
返回收件人;
}
公共IEnumerable getRecipeInfo(字符串recipeName)
{
RecipeDataAdapter.Fill(recipeDataSet.Recipe);
额定值表适配器填充(往复式适配器额定值);
InCreditTableAdapter.Fill(recipeDataSet.RecipeCredit);
IEnumerable recipeInfo=(来自recipeDataSet.Recipe中的
从往复式塔架额定值中的b开始
来自recipeDataSet.RecipeElement中的c
其中a.RecipeName==RecipeName&&
a、 RecipeNum==c.RecipeNum&&
a、 RatingNum==b.RatingNum
选择新的{a.RecipeName,a.National,a.Event,a.Source,b.FamilyRating,c.Component});
返回recipeInfo;
}
}
}

提前感谢您的帮助!!

您遇到了一个异常,因为您在查询中选择了匿名类型,但查询变量的类型是
IEnumerable
。您必须选择字符串,使用
var
关键字或自定义类

如果要返回有用的内容,我将创建一个自定义类,其中包含您在匿名类型中选择的所有这些属性,例如:

public class Recipe
{
    public String RecipeName{ get; set;}
    public String Nationality{ get; set;}
    public String Event{ get; set;}
    // ...
}
然后,您可以从方法返回一个
IEnumerable
,并在查询中选择实例:

...
select new Recipe(){ RecipeName=a.RecipeName, Nationality=a.Nationality, Event=a.Event,... });
旁注:我建议在查询中使用
Join
而不是
Where

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

您使用的是匿名类型,因此:

        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,该IEnumerable具有6个值,可能是所有字符串。
var
不代表“variant”,仍然是强类型声明,只是在编译时解析(如果无法从用法推断类型,则会失败)因此,上面的代码在编译时使
var
mean
IEnumerable
,但是
return
语句试图使这个
IEnumerable
-这就是编译时强制转换异常的地方

我建议您创建一个简单的类来保存RecipeInfo值,这样您的方法就可以返回
IEnumerable

然后您可以将您的选择投影到以下类型:

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

好了,我用get和set方法创建了一个具有公共属性的新类Recipe,现在我的查询类是recipeDataBase.Recipe'不包含'add'的定义@CraigSmith:What is
add
?您不需要将其添加到某个对象中。只需按上面所示选择它。简化示例(不带连接):
IEnumerable recipeInfo=来自recipeDataSet中的。配方选择新配方(){RecipeName=a.RecipeName,National=a.National,Event=a.Event}
hmmm,修复了添加问题,现在我又回到了无法隐式地……您是否缺少一个强制转换。@CraigSmith:是的,您需要返回
IEnumerable
,而不是
IEnumerable
,因此更改方法签名。问题仍然在于select语句