我有一个雇员班,如下所示
public class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DateTime DOB { get; set; }
}我使用实体框架从数据库中检索员工数据,如下所示
using (var dbContext = new EmployeeEntities())
{
List<Employee> employeeList = new List<Employee>();
employeeList = dbContext.employee.Select(x => new Employee
{
EmployeeID = x.EmployeeID,
Name = x.Name,
Age = x.Age,
DOB = x.DOB
}).ToList();
}然后序列化列表并将其保存为XML文件。
if (employeeList.Count > 0)
{
XmlSerializer mySerializer = new XmlSerializer(typeof(List<Employee>));
TextWriter myWriter = new StreamWriter("D:\\Employee.xml", true);
mySerializer.Serialize(myWriter, employeeList);
myWriter.Close();
}这里我的要求是根据我指定的页面大小将结果集保存到多个XML文件中。例如,如果Employee表包含536行,而我的页面大小为100,则应该将其保存在6个XML文件中,分别包含100、100、100、100、100和36行。如何使用实体框架实现这一目标??
发布于 2018-03-16 12:36:35
在过去,我使用这个Batch扩展方法来完成这个任务:
public static class EnumerableExtensions
{
/// <summary>
/// Splits the values in an enumerable by position into batches of the specified size
/// </summary>
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items, int batchSize)
{
using (var e = items.GetEnumerator())
{
while (e.MoveNext()) // check before entering the loop
{
yield return BatchOf(e, batchSize);
}
}
}
private static IEnumerable<T> BatchOf<T>(IEnumerator<T> e, int batchSize)
{
for (var i = 0; i < batchSize; i++)
{
if (i > 0 && !e.MoveNext()) // already checked once before entering the loop / so only check on subsequent iterations
{
yield break;
}
yield return e.Current;
}
}
}那么它就足够简单了,可以使用:
int i = 0;
foreach (var batch in employeeList.Batch(100))
{
XmlSerializer mySerializer = new XmlSerializer(typeof(List<Employee>));
TextWriter myWriter = new StreamWriter($"D:\\Employee{i++}.xml", true);
mySerializer.Serialize(myWriter, batch.ToList());
myWriter.Close();
}发布于 2018-03-16 12:34:59
您可以使用.Skip()和.Take()来完成这个任务。
.Take()将从列表中获取所定义的项数,如果有较少的项,则将全部取走。.Skip()将跳过定义的金额。
通过拥有tmp变量,您可以关闭employeeList并保存每个文件。
if (employeeList.Count > 0)
{
int take = 100;
int i = 0;
while (employeeList.Any())
{
i++;
var tmp = employeeList.Take(take)ToList();
employeeList = employeeList.Skip(take).ToList();
XmlSerializer mySerializer = new XmlSerializer(typeof(List<Employee>));
TextWriter myWriter = new StreamWriter("D:\\Employee"+i+".xml", true);
mySerializer.Serialize(myWriter, tmp);
myWriter.Close();
}
}https://stackoverflow.com/questions/49320732
复制相似问题