【问题标题】:Linq to Entities subquery to fill array?Linq to Entities 子查询填充数组?
【发布时间】:2012-12-10 22:06:05
【问题描述】:

在 linq 中尝试解决这个问题的实体是新的。我有以下表格:

Customer: Cust_Id, Name

Orders: Order_Id

CustomerOrders: Cust_Id, Order_Id

我有这样的课:

public class Customers
{
public List<Row> Rows { get; set; }

public Customers()
    {
        Rows = new List<Row>();
    }

    
    public class Row
    {
       public int Key { get; set; }
       public string Name { get; set; }
       public List<string> Order_Ids { get; set; }
    }
}

Linq 查询是这样的:

var query = from c in context.Customer
select new Customers.Row
{
    Key = c.Cust_Id,
    Name = c.Name,
    Order_IDs = List<string>( ?? )
};

foreach (var row in query)
{
    Customers.Rows.Add(row);
}

var serializer = new JavaScriptSerializer();
return serializer.Serialize(Customers);

我在哪里有'??',我可以使用子查询或其他东西从CustomerOrders 表中获取Order_Id 的列表吗? 现在,我只能考虑在填满Customers 表后循环它,然后再次查询数据库以获取每个客户的Order Id 的每个数组。

【问题讨论】:

  • Customer.Rows.AddRange(--your LINQ query here --) 将是一个更短的实现

标签: c# asp.net linq linq-to-entities


【解决方案1】:

如果不是必需的,请从“客户”对象中删除“行”集合。这应该足够了:

public class Customer
{
    public int Key { get; set; }
    public string Name { get; set; }
    public List<string> Order_Ids { get; set; }
}

然后你可以这样查询:

var customers = from c in context.Customers
                select new Customer
                {
                    Key = c.Cust_Id,
                    Name = c.Name,
                    Order_IDs = c.Orders.Select(o => o.Order_Id).ToList()
                };

在编写 C# 和使用 EF 时最好处理对象,而不是处理表和行 - 更少混淆。

【讨论】:

  • 我不得不将 List 更改为 List 因为 Order_Id 是 int。但是,我现在在 foreach 行上收到此错误。有任何想法吗? LINQ to Entities 无法识别方法 'System.Collections.Generic.List1[System.Int32] ToList[Int32](System.Collections.Generic.IEnumerable1[System.Int32])' 方法,并且此方法无法转换为存储表达式。
  • ToList() 不能转换为 SQL 命令,因此不能用于数据上下文的投影。一种选择是将 Customer 类中的 Order_IDs 更改为 IEnumerable 而不是 List 并删除 ToList() 如果这能满足您的需要。
  • @GunnerL3510 成功了。感谢大家的帮助!
  • @user1892967 太棒了!编码愉快!
【解决方案2】:

试试这样的:

var query = from c in context.Customer
select new Customers.Row
{
    Key = c.Cust_Id,
    Name = c.Name,
    Order_Ids = c.Rows.Select(row => row.Key.ToString()).ToList()
};

在您拥有.Select(row =&gt; row.Key.ToString()) 的地方,您可以设置您需要的属性(密钥、名称等...)。 Select methodIEnumerable 的扩展方法,它返回您设置的属性类型的集合,在这种情况下,是字符串的集合,因为我使用ToString() 方法对其进行了转换。

【讨论】:

  • 不错的紧凑型 LINQ 解决方案。您也可以像对内联客户的完整查询一样,或者在检索到所有客户后作为嵌套循环。使用 LINQ to Entities 可以将表视为对象数组,编写查询的方式与编写代码从这些数组中选择对象的方式相同。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多