C# 在对象集合的实体框架中拆分字符串,即在新{}

C# 在对象集合的实体框架中拆分字符串,即在新{},c#,entity-framework,linq,C#,Entity Framework,Linq,您好,我在实体框架查询中有一个疑问。我正在从控制器中的一个操作返回此结果 return q.select(t=> new { date1, date2, Name, Status }); date1、date2是数据库中返回逗号分隔日期的字符串字段。 我只想从date1开始第一次约会,但无法获得。 谁能帮我安排第一次约会吗。 我试过两种方法,比如 date1 = date1.split(',')[0]; date1 = date1.split(',').take(0)

您好,我在实体框架查询中有一个疑问。我正在从控制器中的一个操作返回此结果

return q.select(t=> new 
{
  date1,
  date2,
  Name,
  Status
});
date1、date2是数据库中返回逗号分隔日期的字符串字段。 我只想从date1开始第一次约会,但无法获得。 谁能帮我安排第一次约会吗。 我试过两种方法,比如

date1 = date1.split(',')[0]; 
date1 = date1.split(',').take(0).firstOrDefault();
但是面对这个错误

LINQ to实体无法识别方法“System.String[] Split(Char[])方法,此方法无法转换为 存储表达式


错误是非常自描述性的-EF无法创建将进行字符串拆分的SQL代码。您只能将数据下载到内存中,然后进行拆分:

 q.Select(t=> new { // translated into SQL
     t.date1, 
     t.date2, 
     t.Name, 
     t.Status
   })
  .AsEnumerable() // moves further execution into memory
  .Select(x => new {
      data1 = x.data1.Split(',')[0], // now you can use any c# code here
      x.data2,
      x.Name,
      x.Status
  });
第一个
Select
语句被转换为SQL查询:

SELECT date1, date2, Name, Status FROM table
若您的表有很多字段,那个么保留它是有意义的,以避免通过网络传输所有这些字段

接下来,使用
AsEnumerable()
在内存中处理数据库查询结果


第二个
Select
语句用于将查询结果投影到您需要的东西中,而无需将其转换为SQL。

在使用C方法(如
Split
)之前,您需要使用
AsEnumerable
ToList
将查询带到内存中。如果数据量很大,最好从数据库本身返回所需的数据。另外,存储这样的日期意味着您的数据库模式有一个大问题。每列都应该是离散的,并且具有适当的数据类型。@TimSchmelter true:)