C# Linq ToString()如何转换?

C# Linq ToString()如何转换?,c#,entity-framework,linq,C#,Entity Framework,Linq,我知道Linq无法处理ToString(),我已经阅读了一些解决方法,大多数似乎是在Linq查询之外进行转换,但这是为了输出,我试图将其放入一个列表,这就是它爆炸的地方 正如下面的代码所示,为了使它适合Linq,我已经在其他地方做了一些转换,但是最后一部分有tostring,我也需要重写它,但我不确定如何重写 DateTime edate = DateTime.Parse(end); DateTime sdate = DateTime.Parse(start); var reading = (

我知道Linq无法处理
ToString()
,我已经阅读了一些解决方法,大多数似乎是在Linq查询之外进行转换,但这是为了输出,我试图将其放入一个列表,这就是它爆炸的地方

正如下面的代码所示,为了使它适合Linq,我已经在其他地方做了一些转换,但是最后一部分有tostring,我也需要重写它,但我不确定如何重写

DateTime edate = DateTime.Parse(end);
DateTime sdate = DateTime.Parse(start);

var reading = (from rainfall in db.trend_data
               join mid in db.measurements on rainfall.measurement_id equals mid.measurement_id
               join siteid in db.sites on mid.site_id equals siteid.site_id
               where siteid.site_name == insite && rainfall.trend_data_time >= sdate && rainfall.trend_data_time <= edate
               select new GaugeData() { SiteID = siteid.site_name, Data_Time = rainfall.trend_data_time, Trend_Data = float.Parse(rainfall.trend_data_avg.ToString()) }).ToList();
DateTime-edate=DateTime.Parse(end);
DateTime sdate=DateTime.Parse(开始);
var读数=(以db.trend_数据表示的降雨量)
将mid加入db.measurements on rainment.measurement_id等于mid.measurement_id
在mid上的db.sites中加入siteid。site\u id等于siteid.site\u id

当siteid.site\u name==insite&&rainum.trend\u data\u time>=sdate&&rainum.trend\u data\u time时,您可以使用
Convert.ToSingle()
方法,
float
system.single
的别名

Trend_Data = Convert.ToSingle(rainfall.trend_data_avg)

Linq将处理它,但是Linq2Entities不会,因为EF将希望将该表达式中继到DbProvider,而DbProvider不理解/转换所有.Net方法

在从实体提取数据时,最简单的方法是让实体定义使用与SQL数据类型匹配的兼容.Net类型。然后,当您想将数据加载到视图模型/DTO中,您可能想在其中执行格式化或数据类型转换时,让ViewModel/DTO来处理该问题,或者将Linq2Entity查询重新物化为匿名类型列表,然后使用LINQ2对象处理转换

在不知道TrendDataAvg的数据类型的情况下,示例中的值存储为十进制,但您希望使用浮点:

ViewModel中的格式示例:

public class TrendData // Entity
{  // ...
   public decimal trend_data_avg { get; set; }
   // ...
}

public class GuageData  // ViewModel
{
   public decimal trend_data_avg { get; set; } // Raw value.
   public float Trend_Data // Formatted value.
   {
      get { return Convert.ToSingle(trend_data_avg); }
   }
}

var reading = (from rainfall in db.trend_data
               join mid in db.measurements on rainfall.measurement_id equals mid.measurement_id
               join siteid in db.sites on mid.site_id equals siteid.site_id
               where siteid.site_name == insite && rainfall.trend_data_time >= sdate && rainfall.trend_data_time <= edate
               select new GaugeData() { SiteID = siteid.site_name, Data_Time = rainfall.trend_data_time, trend_data_avg = rainfall.trend_data_avg }).ToList();
公共类趋势数据//实体
{  // ...
公共十进制趋势数据平均值{get;set;}
// ...
}
公共类GuageData//ViewModel
{
公共十进制趋势数据平均值{get;set;}//原始值。
公共浮点趋势\ U数据//格式化值。
{
获取{return Convert.ToSingle(trend_data_avg);}
}
}
var读数=(以db.trend_数据表示的降雨量)
将mid加入db.measurements on rainment.measurement_id等于mid.measurement_id
在mid上的db.sites中加入siteid。site\u id等于siteid.site\u id
其中siteid.site\u name==insite&&raining.trend\u data\u time>=sdate&&raining.trend\u data\u time=sdate&&raining.trend\u data\u time新计量数据
{
SiteID=站点名称,
数据时间=趋势数据时间,
趋势数据=转换为单个(趋势数据平均值)
}).ToList();
注意:如果您使用匿名类型方法,并希望利用分页、附加筛选等功能,那么请确保在初始.ToList()调用之前执行此操作,以便由Linq2EF处理。否则,您将从EF获取比潜在性能和资源利用问题所需的更大的数据集

此外,如果在实体中设置导航属性,则可以避免所有显式连接语法。EF设计用于在关系数据库中进行提升,而不仅仅是T-SQL的替代语法

// Given trend data has a single measurement referencing a single site.
var gaugeData = db.trend_data
    .Where(x => x.trend_data_time >= sdate 
        && x.trend_data_time <= edate
        && x.measurement.site.site_name == insite))
    .Select(x => new 
    {
        x.measurement.site.site_name,
        x.trend_data_time,
        x.trend_data_avg
    }).ToList()
    .Select( x=> new GaugeData
    {
        SiteID = site_name, 
        Data_Time = trend_data_time, 
        Trend_Data = Convert.ToSingle(trend_data_avg) 
    }).ToList();
//给定的趋势数据具有引用单个站点的单个度量。
var gaugeData=db.trend\u数据
其中(x=>x.trend\u data\u time>=sdate
&&x.趋势\数据\时间新
{
x、 测量地点地点地点名称,
x、 趋势数据时间,
x、 趋势数据平均值
})托利斯先生()
.选择(x=>新计量数据
{
SiteID=站点名称,
数据时间=趋势数据时间,
趋势数据=转换为单个(趋势数据平均值)
}).ToList();

什么是
rainment.trend\u data\u avg
的SQL数据类型?如果需要.ToString+.Parse,那么很可能是您做错了。DB应该改用float类型。您可以使用
Convert.ToSingle()
方法,
float
系统的别名。single
Linq可以处理ToString()数值变量的方法。对于类,只需给出类名,除非类具有内置的ToString()方法,否则不会将对象序列化为字符串。这(
Trend\u Data=float.Parse(rainment.Trend\u Data\u avg.ToString())
)一点也不对劲。什么类型是趋势数据?什么SQL类型是降雨。趋势数据?平均值?
浮动。解析或转换。ToSingle
实际上并不重要-如果这是对对象的LINQ,则两者都可以使用。但是它不是-注意标记
实体框架和
数据库。
通常指示ing
DbContext
谢谢你的评论,我想我学到了一些东西。
// Given trend data has a single measurement referencing a single site.
var gaugeData = db.trend_data
    .Where(x => x.trend_data_time >= sdate 
        && x.trend_data_time <= edate
        && x.measurement.site.site_name == insite))
    .Select(x => new 
    {
        x.measurement.site.site_name,
        x.trend_data_time,
        x.trend_data_avg
    }).ToList()
    .Select( x=> new GaugeData
    {
        SiteID = site_name, 
        Data_Time = trend_data_time, 
        Trend_Data = Convert.ToSingle(trend_data_avg) 
    }).ToList();