如何使用 linq 到实体获取属性中的项目数组?

Posted

技术标签:

【中文标题】如何使用 linq 到实体获取属性中的项目数组?【英文标题】:How to i get array of items in properties with linq to entities? 【发布时间】:2012-01-02 13:39:44 【问题描述】:

考虑:

class Foo

    public string Nameget;set;
    public string[] WebSitesget;set;

我有一个问题:

var allFoo=db.Persons.Select(p=>new Foo()

    Name=p.Name,
    WebSites=p.WebSites.Select(q=>q.Caption).ToArray(),
).ToList();

但我收到错误“LINQ to Entities 无法识别方法 'System.String[] ToArray...”。

如何通过 linq 到实体的数组中获取所有 foo 和网站字符串?

【问题讨论】:

你能显示你的 Persons 类的定义吗? 可能有用social.msdn.microsoft.com/Forums/en/adodotnetentityframework/… 【参考方案1】:

这样的事情应该可以工作:

var allFooAnon = db.Persons.Select(p => new

  Name = p.Name,
  Websites = p.Websites.Select(q => q.Caption)
);

var list = new List<Foo>();
foreach (var anon in allFooAnon)

  list.Add(new Foo
  
    Name = anon.Name,
    Websites = anon.Websites.ToArray()
  );

这会创建一组匿名类型的对象来保存查询结果。然后,您可以遍历这些对象以创建您的 Foo 集合。

【讨论】:

【参考方案2】:

要使用像ToArray 这样的方法,您可能必须使用ToList 将所有对象加载到内存中。

【讨论】:

【参考方案3】:

鉴于您的评论:但我收到错误“LINQ to Entities 无法识别方法 'System.String[] ToArray..

我建议从

中剥离 .ToArray()
WebSites=p.WebSites.Select(q=>q.Caption).ToArray(), 

因为显然是

的结果
p.WebSites.Select(q=>q.Caption) is a System.String[]

这仅意味着您将执行从 System.String[] 到 string[] 的显式转换,这应该没问题。

【讨论】:

-1: p.WebSites.Select(q=&gt;q.Caption) 的类型为 IEnumerable&lt;string&gt;

以上是关于如何使用 linq 到实体获取属性中的项目数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取不在上下文中的linq-query实体?

用于从实体类及其导航属性中选择多个列的 Linq Lambda 表达式

NSPredicate 获取属性不在给定数组中的实体

使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值

如何查询实体框架中的非映射属性?

选择特定实体 LINQ 的属性