我有这段代码:
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
答案 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"};