LINQ:选择一个对象,但在不创建新对象的情况下更改某些属性

时间:2010-12-09 14:28:37

标签: linq-to-sql

我正在尝试使用LINQ SQL中的另一个对象的值来选择一个对象,

我目前有这个,

    var result1 = (from s in pdc.ScanLogs
                   from ec in pdc.ExhibitsContacts
                   where s.ExhibitID == ec.ExhibitID
           select ec.Contact);

我想指定一个ec.Contact.Note = ec.Comment的值; 有没有办法在LINQ SQL中执行此操作而不编写多个查询?

我读过这篇博客文章:http://blog.robvolk.com/2009/05/linq-select-object-but-change-some.html但它似乎不适用于LINQ SQL。

2 个答案:

答案 0 :(得分:1)

基本上你不能这样做。 LINQ旨在成为一种查询语言,您想要做的是使用您的查询改变现有实体。这意味着您的查询会产生副作用,这不是LINQ to SQL支持的内容。

虽然在返回LINQ to SQL实体时,这在单个查询中不起作用,但是当您返回简单的DTO结构时,它将起作用。例如:

var result1 =
    from s in pdc.ScanLogs
    from ec in s.ExhibitsContacts
    select new ContactDto
    {
        Id = ec.Contact.Id,
        Note = ec.Comment,
        SomeOtherFields = ec.Contact.SomeOtherFields
    };

作为旁注:还要看一下如何通过使用where s.ExhibitID == ec.ExhibitID实体的ExhibitsContacts属性(将由LINQ生成)从查询中删除ScanLog连接当您的数据库模式定义了正确的外键时,为您提供SQL。

<小时/> 的更新

当您需要从多个方法返回这些DTO时,您可以考虑将转换从实体集合集中到DTO对象的集合。我倾向于将此方法放在DTO上(这使得它很容易找到)。代码可能如下所示:

public class ContactDto
{
    // Many public properties here

    public static IQueryable<ContactDto> ToDto(
        IQueryable<Contact> contacts)
    {
        return
            from contact in contacts
            select new ContactDto
            {
                Id = contact.Id,
                Note = contact.ExhibitsContact.Comment,
                ManyOtherFields = contact.ManyOtherFields
            };
    }
}

这种静态转换方法的技巧是它需要IQueryable并返回IQueryable。这允许简单地指定转换并让LINQ to SQL(或任何其他启用LINQ的O / RM)在以后有效地执行该LINQ表达式。原始代码现在看起来像这样:

IQueryable<Contact> contacts =
    from s in pdc.ScanLogs
    from ec in s.ExhibitsContacts
    select ec.Contact;

IQuerable<ContactDto> result1 = ContactDto.ToDto(contacts);

答案 1 :(得分:0)

问题是LINQ to SQL不知道如何解释你的扩展方法。唯一的方法是,除了使用从LINQ到SQL的存储过程(哪种类型会破坏ponit)之外,还有获取对象,更新然后提交更改。