我只是尝试将字符串连接到从数据库返回的列,如下所示:
var aaData =
(from pr in ctx.PaymentRates
where pr.ServiceRateCodeId == new Guid("BBCE42CB-56E3-4848-B396-4656CCE3CE96")
select new
{
Id = pr.Id,
Rate = pr.YearOneRate + "helloWorld"
})
.ToList();
它给了我这个错误:
无法转换类型&System;可用性`1'键入' System.Object'。 LINQ to Entities仅支持转换EDM原语或枚举 类型。
所以,我试过这个:
var aaData =
(from pr in ctx.PaymentRates
where pr.ServiceRateCodeId == new Guid("BBCE42CB-56E3-4848-B396-4656CCE3CE96")
select new
{
pr = pr
})
.AsEnumerable()
.Select(x => new
{
Id = x.pr.Id,
Rate = x.pr.YearOneRate + "helloWorld"
})
.ToList();
但是,现在它给了我这个错误:
对象引用未设置为对象的实例。
在这一行:
.Select(x => new
如何在LINQ中连接这些字符串?
答案 0 :(得分:2)
快速解决方案
关于你的第二个代码块,我需要指出你实际上在Countries
表/集上做了两个左外连接,一个用于homeC
,一个用于{{1} }。
这意味着您愿意接受这两个变量的hostC
值。
换句话说,因为他们可以成为null
你在某种程度上允许这一点与null
一起崩溃,如果这些变量变成NullReferenceException
:< / p>
null
错误(.Select(x => new
{
Id = x.pr.Id,
HomeCountry = x.homeC.Name,
HostCountry = x.hostC.Name,
Rate = x.pr.YearOneRate + "helloWorld"
})
或您看到它的消息:“对象引用未设置为对象的实例。”)不在此处
NullReferenceException
而是在这里
.Select(x =>
和x.homeC.Name
您肯定会取消引用x.hostC.Name
引用。
这只是Visual Studio指出适合错误的最佳语句的方式。
因此,最快的解决方案是:
null
请注意修改,以确保您仍然可以从.Select(x => new
{
Id = x.pr.Id,
HomeCountry = (x.homeC != null) ? x.homeC.Name : "HomeCountry not found",
HostCountry = (x.hostC.Name != null) ? x.hostC.Name : "HostCountry not found",
Rate = x.pr.YearOneRate + "helloWorld"
})
和homeC
为hostC
的结果集记录中提取部分信息。< / p>
修改强>
关于您发布的第一个查询:
null
我的猜测是'YearOnRate'属性的类型为'Nullable&lt;某事&gt;“(也许var aaData =
(from pr in ctx.PaymentRates
where pr.ServiceRateCodeId == new Guid("BBCE42CB-56E3-4848-B396-4656CCE3CE96")
select new
{
Id = pr.Id,
Rate = pr.YearOneRate + "helloWorld"
})
.ToList();
- 所以例如它可能是decimal
)并且数据库中的相应列是可以为空的。
如果是这种情况,那么我认为(在你努力的第一个版本中)你可以尝试这样做:
decimal? YearOnRate { get; set; }
并侥幸逃脱。
答案 1 :(得分:1)
我的猜测是x.homeC
,x.hostC
或x.pr
为空。如果您可以使用AsEnumerable
转换为Linq-to-Objects,那么您只需将预测更改为
.Select(x => new
{
Id = (x.pr.HasValue ? x.pr.Id : 0),
HomeCountry = (x.homeC.HasValue ? x.homeC.Name : null),
HostCountry = (x.hostC.HasValue ? x.hostC.Name : null),
Rate = (x.pr.HasValue ? x.pr.YearOneRate : null) + "helloWorld"
})
答案 2 :(得分:0)
您已在DefaultIfEmpty
和homeC
上使用hostC
,因此当您致电homeC.Name
或hostC.Name
尝试使用HomeCountry = homeC == null ? null : homeC.Name
代替
如果pr.YearOneRate
不是字符串,并且您希望数据库引擎完成连接,则需要告诉Linq-to-Entities生成用于转换它的sql。如果您使用的是Sql Server,可以使用:
SqlFunctions.StringConvert(pr.YearOneRate) + "helloWorld"
如果您不需要在数据库中完成连接,那么您可以在Select之前使用AsEnumerable()
,以便运行Linq-To-Objects
答案 3 :(得分:0)
我的问题是,我没有正确使用.AsEnumerable()
。以下代码有效:
var aaData =
(from pr in ctx.PaymentRates
from homeC in ctx.Countries.Where(x => x.Id == pr.HomeCountryId).DefaultIfEmpty()
from hostC in ctx.Countries.Where(x => x.Id == pr.HostCountryId).DefaultIfEmpty()
from curr in ctx.Currencies.Where(x => x.Id == pr.YearOneCurrencyId).DefaultIfEmpty()
where pr.ServiceRateCodeId.Value.Equals(new Guid("BBCE42CB-56E3-4848-B396-4656CCE3CE96"))
select new { pr, homeC, hostC, curr })
.AsEnumerable()
.Select(x => new
{
Id = (string)(x.pr.Id.ToString() + "test"),
HomeCountry = (x.homeC != null ? x.homeC.Name : ""),
HostCountry = (x.hostC != null ? x.hostC.Name : ""),
Rate = (x.pr.YearOneRate ?? 0) + " (" + x.curr.Code + ")"
})
.ToList();