我有一个这样的集合:
IEnumerable<RecordToSend> recordsToSend;
由以下内容组成:
public class RecordToSend {
public Guid ApplicationId { get; set; }
public ScheduleTypes Schedule { get; set; }
}
并标记枚举:
[Flags]
public enum ScheduleTypes
{
None = 0,
Daily = 1,
Weekly = 2,
Monthly = 4
}
所以,让我们说我有以下集合,它基本上是使用实体框架查询从数据库中取出的:
| ApplicationId | Schedule |
| ABC123 | 7 |
| DEF456 | 3 |
将枚举分成多个不同记录的有效方法是什么,导致这种情况(可以使用RecordToSend
类或其他类型,如果有意义则使用动态):
| ApplicationId | Schedule |
| ABC123 | 1 |
| ABC123 | 2 |
| ABC123 | 4 |
| DEF456 | 1 |
| DEF456 | 2 |
注意ScheduleTypes
枚举有一个0值标志,我想在结果中忽略它。
效率并不是最令人担忧的,尽管我很想知道不同方法的表现。如果我可以在一个步骤中执行此拆分作为实体框架查询的一部分,因为我将集合从数据库中拉出来,那将是很好的。在应用程序中,我不需要在其原始的多值状态下使用枚举标志。
答案 0 :(得分:4)
这应该有用。
/**
* @Entity
* @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"store_id", "user_id"})})
*/
class ECommerceProduct
{
}
基本上,对于每个记录,它循环遍历可能的枚举值(跳过0值)并检查var results = records.SelectMany(
r => Enum.GetValues(typeof(ScheduleTypes))
.Cast<ScheduleTypes>()
.Where(e => e != ScheduleTypes.None && r.Schedule.HasFlag(e))
.Select(e =>
new RecordToSend
{
Guid = r.Guid,
Schedule = e
}));
是否具有该标志。然后创建一个具有相同Schedule
和枚举标志的新记录。 Guid
然后展平已创建的记录集合。
请注意,如果SelectMany
是records
,您必须添加IQueryable
,因为我怀疑这会转换为SQL。
答案 1 :(得分:-1)
尝试linq
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IEnumerable<RecordToSend> recordsToSend = new List<RecordToSend>() {
new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000123"), Schedule = ScheduleTypes.Daily},
new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000123"), Schedule = ScheduleTypes.Weekly},
new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000123"), Schedule = ScheduleTypes.Monthly},
new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000456"), Schedule = ScheduleTypes.Daily},
new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000456"), Schedule = ScheduleTypes.Weekly}
};
var results = recordsToSend.AsEnumerable()
.GroupBy(x => x.ApplicationId)
.Select(x => new {
ApplicationID = x.Key,
Schedule = x.Select(y => (int)y.Schedule).Sum()
}).ToList();
}
}
[Flags]
public enum ScheduleTypes
{
None = 0,
Daily = 1,
Weekly = 2,
Monthly = 4
}
public class RecordToSend
{
public Guid ApplicationId { get; set; }
public ScheduleTypes Schedule { get; set; }
}
}