C# 如何将类型设置为IEnumerable<&燃气轮机;结果是否会有多种类型?
问题我正在尝试一些新的东西,我以前做的一个程序。在第一个程序中,我能够拖放表适配器,并使用通用的“var”存储查询结果。现在我正在尝试创建一个新的程序,它有一些代码分离。例如,在第一个程序中,我将所有代码都写在form.cs文件中,这次我想创建一个类来运行查询并将其返回给调用类,但是,如何存储包含许多类型的查询结果?不能返回var变量,它必须更具体。我在选择行上得到一个错误,该错误为:“无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.IEnumerable;。存在显式转换(是否缺少强制转换?) 有人能帮我吗?强制转换是什么?第一个方法(public IEnumerable getList())按预期工作。第二个方法(public IEnumerable getRecipeInfo(string recipeName))是我得到错误的地方。这是我到目前为止的代码C# 如何将类型设置为IEnumerable<&燃气轮机;结果是否会有多种类型?,c#,linq,C#,Linq,问题我正在尝试一些新的东西,我以前做的一个程序。在第一个程序中,我能够拖放表适配器,并使用通用的“var”存储查询结果。现在我正在尝试创建一个新的程序,它有一些代码分离。例如,在第一个程序中,我将所有代码都写在form.cs文件中,这次我想创建一个类来运行查询并将其返回给调用类,但是,如何存储包含许多类型的查询结果?不能返回var变量,它必须更具体。我在选择行上得到一个错误,该错误为:“无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'Syst
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
meanIEnumerable
,但是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语句