有没有更好的方法来编写这个LINQ片段?

时间:2009-03-10 14:41:49

标签: linq .net-3.5

我有这段代码:

SmsDataClassesDataContext dc = new SmsDataClassesDataContext();

        // Get the customer
        Customer currentCustomer = dc.Customers.Single( c => c.Hash1 == forThisHash );


        // Get from Name (LINQ to XML) 
        var q = from c in thisSmsPack.Descendants("from")
                select c;

        string from = q.First().Value;

        foreach ( XElement element in thisSmsPack.Descendants("to") )
        {
            // Create the queue
            SmsQueue sq = new SmsQueue();
            sq.CustomerId = currentCustomer.CustomerId;
            sq.MsgFrom = from;

            sq.MsgTo = element.Attribute("name").Value;
            sq.MsgPhone = element.Attribute("phone").Value;
            sq.MsgBody = element.Attribute("msg").Value;
            sq.Priority = currentCustomer.SendsSmsAtPriority;
            sq.DontSendUntil = GetNextSendDate();

             // sq.TimeCreated = System.DateTime.Now;

            currentCustomer.SmsQueues.Add(sq);
        }
        dc.SubmitChanges();

我正在创建“SmsQueues”的新实例,填充值,当foreach循环完成时,我提交更改。鉴于.NET 3.5具有新的lambda / linq / anonymous类型,是否有更“现代”的方法来实现上述目标?

作为一个附带问题,也许是相关的,我可以在linq表达式的select部分中返回由不同列组成的现有类型吗?

假设您有三个表:

T1 == T1.Id,T1.Name

T2 == T2.Id,T2.Phone

T3 == T3.Name,T3.Phone,T3.SomethingElse

我可以执行返回的LINQ查询:

T1.Name,T2.Phone,SomethingElseNew

让.NET知道那是T3类型(它是它的一个新实例)? 那样,当我提交更改时,新的T3实例会插入到数据库中吗?

我不知道自己是否清楚:S

2 个答案:

答案 0 :(得分:3)

我没有可用于测试此系统的系统,但我认为这(或非常接近的)应该有效。

CustomerId = currentCustomer.CustomerId;
var sqrange = from element in thisSmsPack.Descendants("to") )
              select new SmsQueue
              {
             // Create the queue
                MsgFrom = from,
                MsgTo = element.Attribute("name").Value,
                MsgPhone = element.Attribute("phone").Value,
                MsgBody = element.Attribute("msg").Value,
                Priority = currentCustomer.SendsSmsAtPriority,
                DontSendUntil = GetNextSendDate()
             // TimeCreated = System.DateTime.Now
            };
    currentCustomer.SmsQueues.AddRange(sqrange);

编辑:修正了众多语法错误(如评论中所描述的)

答案 1 :(得分:0)

你可以做这样的事情(语法可能稍微偏离,这里没有intellisense):

var q = T1.Join(T2, t => t.Id, t2 => t2.Id)
    select new T3{Name=t.Name,Phone=t2.Phone,SomethingElseNew="Chickens"};