我正在使用EF6,我的一个型号名称是tblAttachLabel。我有自定义的名称为AttachLabel的模型。我需要一个自定义模型的IEnumerable,它填充了tblAttachLabel模型。它很容易返回
IEnumerable<tblAttachLabel>
从我的功能,但我需要返回
IEnumerable<AttachLabel>
所以我做了这段代码:
public static IEnumerable<AttachLabel> GetAttachLabel()
{
Entities db = new Entities();
var x = from al in db.tblAttachLabels select al;
List<AttachLabel> temp = new List<AttachLabel>();
IEnumerable<AttachLabel> _attachLabel;
foreach (var item in x)
{
AttachLabel a = new AttachLabel()
{
ID = item.ID,
Text = item.Text
};
temp.Add(a);
}
_attachLabel = temp;
return _attachLabel;
}
但我知道当我使用List for temp时,查询将会执行,但我不想这样做。那我怎么能返回一个IEnumerable?
答案 0 :(得分:2)
请改为尝试:
public static IEnumerable<AttachLabel> GetAttachLabel()
{
Entities db = new Entities();
return from item in db.tblAttachLabels select new AttachLabel()
{
ID = item.ID,
Text = item.Text
};
}
答案 1 :(得分:1)
@ haim770答案的另一个可能性和替代方案是使用yield
关键字的循环:
在语句中使用yield关键字时,表明它出现的方法,运算符或get访问器是迭代器。使用yield来定义迭代器时,在为自定义集合类型实现IEnumerable和IEnumerator模式时,不需要显式的额外类(保存枚举状态的类,请参阅IEnumerator中的示例)。
public static IEnumerable<AttachLabel> GetAttachLabel()
{
using(Entities db = new Entities())
{
foreach (var item in db.tblAttachLabels)
{
AttachLabel a = new AttachLabel()
{
ID = item.ID,
Text = item.Text
};
yield return a;
}
}
yield break;
}
您的上下文也应该被处理,所以我添加了using
声明。
并且不需要:
from al in db.tblAttachLabels select al;
因为它只返回与db.tblAttachLabels
相同的集合。
答案 2 :(得分:1)
public static IEnumerable<AttachLabel> GetAttachLabel()
{
Entities db = new Entities();
var items = from al in db.tblAttachLabels select al;
return items.Select(new AttachLabel()
{
ID = item.ID,
Text = item.Text
});
}
答案 3 :(得分:0)
其中一个,取决于您是否更喜欢lambda表达式:
public static IEnumerable<AttachLabel> GetAttachLabel()
{
using (var db = new Entities())
{
return db.tblAttachLabels.Select(item => new AttachLabel
{
ID = item.ID,
Text = item.Text
});
}
}
与否:
public static IEnumerable<AttachLabel> GetAttachLabel()
{
using (var db = new Entities())
{
return from item in db.tblAttachLabels
select new AttachLabel
{
ID = item.ID,
Text = item.Text
};
}
}