我正在尝试使用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。
答案 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)之外,还有获取对象,更新然后提交更改。