获取元组和列表作为结果链接

时间:2014-12-23 12:31:06

标签: linq linq-to-sql

我有这个问题:

var query = (from tables ... 
             where ...
             select new
             {
                 ClientName = ClientName,
                 ClientNumber = ClientNumber,
                 ClientProduct = ClientProduct
             }).Distinct();

返回包含3个值的行。 ClientName和ClientNumber可以链接到多个产品。

所以我们可以:

NameA NumberA Product1
NameA NumberA Product2
NameA NumberA Product3
NameB NumberB Product4
NameC NumberC Product5

我想知道是否可以将其存储在某个类的列表中,如下所示:

class MyClass
{
    string ClientName, 
    int ClientNumber, 
    List<int> ClientProducts
}

因此没有ClientName和ClientNumber的重复。

提前谢谢你。

3 个答案:

答案 0 :(得分:1)

使用此类结构来表示您的数据:

class MyClass
{
    public string ClientName { get; set; }
    public int ClientNumber { get; set; }
    public List<int> ClientProducts { get; set; }
}

class Procuct
{
    public string ClientName { get; set; }
    public int ClientNumber { get; set; }
    public int ProductID { get; set; }
}

和这个测试数据:

List<Procuct> Products = new List<Procuct>()
{
    new Procuct() { ClientName = "A", ClientNumber = 1, ProductID = 1},
    new Procuct() { ClientName = "A", ClientNumber = 1, ProductID = 2},
    new Procuct() { ClientName = "A", ClientNumber = 1, ProductID = 3},
    new Procuct() { ClientName = "B", ClientNumber = 2, ProductID = 4},
    new Procuct() { ClientName = "C", ClientNumber = 2, ProductID = 5}
};

您可以使用以下linq查询:

var q = from p in Products
        group p by new 
        {
           cName = p.ClientName,
           cNumber = p.ClientNumber
        } into pGroup
        select new MyClass
        {
           ClientName = pGroup.Key.cName,
           ClientNumber = pGroup.Key.cNumber,
           ClientProducts = pGroup.Select(x => x.ProductID).ToList()
        };

获得您想要的内容,即MyClass个对象的集合。

上述linq查询中执行的 分组 基本上保证(ClientName, ClientNumber)上不会有重复项。

答案 1 :(得分:1)

由于您提到Linq-to-sql,很可能您的客户实体已经链接了产品。您可能会寻找一个过于复杂的解决方案。

这取决于你的外键结构,但是如果你的数据模型是 客户端有1个多产品,并且您已经存在从产品到客户端的外键。

所以你可以参考client.Products

所以在你的情况下,它将是

var query = (from Clients... 
             where ...
             select new
             {
                 ClientName = Client.ClientName,
                 ClientNumber = Client.ClientNumber,
                 ClientProduct = Client.Products.Select(s=>s.id).ToList()
             });

但您也可以简单地使用您的客户实体加载产品。

这完全取决于您的数据模型+正确的外键结构 如果您的客户端和产品之间有许多关联,例如每个客户端的产品,则可以从该实体开始。看看这个文档 - 它为Linq-2-sql提供了一个很好的起点。 http://weblogs.asp.net/scottgu/using-linq-to-sql-part-1

答案 2 :(得分:0)

我解决了同样的问题,我认为对你有用 只检查 Where 条件是否正确 谢谢......

var query = (from tables ... 
         where ...
         select new
         {
             ClientName = ClientName,
             ClientNumber = ClientNumber,
             ClientProduct = ClientProduct.ToList()
         }).Distinct();