无法在LINQ查询中连接字符串

时间:2014-01-28 16:22:07

标签: c# linq entity-framework

我只是尝试将字符串连接到从数据库返回的列,如下所示:

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中连接这些字符串?

4 个答案:

答案 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" }) homeChostC的结果集记录中提取部分信息。< / 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.homeCx.hostCx.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)

您已在DefaultIfEmptyhomeC上使用hostC,因此当您致电homeC.NamehostC.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();