结果为分隔字符串的 LINQ 匿名对象(LINQ to Entities 无法识别方法"System.String ToString()"方法)



我正在尝试获取一个人拥有的所有亲属的 ; 分隔字符串。涉及四个表:

"用户"选项卡人PERSON_RELATIONRELATION_TAB

查询

from u in USERTAB
select new
{
    Person = from p in PERSON where p.USERID == u.USERID
       select new
        {
          PNo = p.NO,
          Name = p.NAME
          Relatives = (from r in PERSON_RELATION where r.PSEQ == p.PSEQ select new
          {
            Description = (from rel in RELATION_TYPE where rel.TYPE_SEQ == r.TYPE_SEQ select rel.DESCRIPTION).ToArray() //(or also tried .ToString())
          })                                     
        }
}

我希望"描述"字段是用户(人)拥有的所有亲属的";"分隔列表。

在我的亲戚对象上使用 ToString,它只会在运行时失败。LINQ to Entities 无法识别方法 'System.String ToString()' 方法

示例:说明 ="父亲、兄弟、堂兄"

您需要清楚查询的哪些部分被转换为 SQL 以在服务器上运行,以及哪些部分在本地应用程序中运行。关键是构造一个简单的查询来检索所有数据,然后使用 .AsEnumerable() 来确保剩余的转换不会转换为 SQL,最后将数据转换为对您有用的形式。类似的东西

var query =
    from u in USERTAB
    select new
    {
        Person =
            from p in PERSON
            where p.USERID == u.USERID
            select new
            {
                PNo = p.NO,
                Name = p.NAME
                Relatives =
                    from r in PERSON_RELATION
                    where r.PSEQ == p.PSEQ
                    select new
                    {
                        Description =
                            from rel in RELATION_TYPE
                            where rel.TYPE_SEQ == r.TYPE_SEQ
                            select pos.DESCRIPTION
                    }
            }
        }
    };
var enumerable =
    from u in query.AsEnumerable()
    select new
    {
        Person =
            from p in u.Person
            select new
            {
                PNo = p.PNo,
                Name = p.Name
                Relatives =
                    string.Join(", ",
                        from r in p.Relatives
                        from d in r.Description
                        select d.Description)
            }
        }
    };

应该做这个伎俩。

这应该有效:为数组字符串编写一个扩展方法,如下所示:

public static ToCsv(this string[] strings)
{
    return String.Join("," strings);
}

然后只需在上面的.ToArray()通话结束时.ToCsv(),它应该可以解决问题!

最新更新