C# 如何使用LINQ从对象列表查询到现有对象?

C# 如何使用LINQ从对象列表查询到现有对象?,c#,linq,sharepoint,C#,Linq,Sharepoint,我不确定这在LINQ中是否可行,但我有以下场景: 我正在使用多个查询多次调用SharePoint列表服务。然后,我从所有查询中填充单个对象及其属性。我正在使用LINQ查询返回的XElement。我知道如果调用到达这一点,我的LINQ查询将只返回一个项。目前,我必须查询一个新对象,然后从这个新对象(来自LINQ)为每个web服务调用设置我的主对象的属性。(下面的代码示例仅包含需要查询和设置的“操作”项属性的一小部分。) 有没有办法将下面的语句“select”放入我现有的“action”对象中 va

我不确定这在LINQ中是否可行,但我有以下场景:

我正在使用多个查询多次调用SharePoint列表服务。然后,我从所有查询中填充单个对象及其属性。我正在使用LINQ查询返回的XElement。我知道如果调用到达这一点,我的LINQ查询将只返回一个项。目前,我必须查询一个新对象,然后从这个新对象(来自LINQ)为每个web服务调用设置我的主对象的属性。(下面的代码示例仅包含需要查询和设置的“操作”项属性的一小部分。)

有没有办法将下面的语句“select”放入我现有的“action”对象中

var item = (from listItem in result.GetSPListItems()
            select new ContractAction
            {
                Title = listItem.GetSPFieldValue("Title"),
                Description = listItem.GetSPFieldValue("Description"),
                DeliveryOrderID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Delivery Order")),
                EstimatedValue = ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0),
                AgreementTypeID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Contract Type")),                                                
            }).FirstOrDefault();

contractAction.Title = item.Title;
contractAction.Description = item.Description;
contractAction.DeliveryOrderID = item.DeliveryOrderID;
contractAction.EstimatedValue = item.EstimatedValue;
contractAction.AgreementTypeID = item.AgreementTypeID;
你不能简单地:

action = (from listItem in result.GetSPListItems()
         select new Action
         {
             Title = listItem.GetSPFieldValue("Title"),
             Description = listItem.GetSPFieldValue("Description"),
             DeliveryOrderID = SPHelper.GetFirstLookupID(listItem
                 .GetSPFieldValue("Delivery Order")),
             EstimatedValue = 
                 ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0),
             AgreementTypeID = SPHelper.GetFirstLookupID(listItem
                 .GetSPFieldValue("Contract Type")),
         }).FirstOrDefault();
你不能简单地:

action = (from listItem in result.GetSPListItems()
         select new Action
         {
             Title = listItem.GetSPFieldValue("Title"),
             Description = listItem.GetSPFieldValue("Description"),
             DeliveryOrderID = SPHelper.GetFirstLookupID(listItem
                 .GetSPFieldValue("Delivery Order")),
             EstimatedValue = 
                 ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0),
             AgreementTypeID = SPHelper.GetFirstLookupID(listItem
                 .GetSPFieldValue("Contract Type")),
         }).FirstOrDefault();

您可以在一个大查询中编写查询。例如,你可以:

var item = (from listItem in result.GetSPListItems()
        from query2Outer in result.SecondQuery().Where(x => x.ItemEdp == it.ItemEdp).DefaultIfEmpty() // This is an outer join
        select new Action
        {
            //if the one query didn't return an item then it sets the properties to the default values
            Example = (query2Outer == null ? "Default Value" : query2Outer.Example),
            Title = listItem.GetSPFieldValue("Title"),
            Description = listItem.GetSPFieldValue("Description"),
            DeliveryOrderID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Delivery Order")),
            EstimatedValue = ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0),
            AgreementTypeID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Contract Type")),                                                
        }).FirstOrDefault();

您可以在一个大查询中编写查询。例如,你可以:

var item = (from listItem in result.GetSPListItems()
        from query2Outer in result.SecondQuery().Where(x => x.ItemEdp == it.ItemEdp).DefaultIfEmpty() // This is an outer join
        select new Action
        {
            //if the one query didn't return an item then it sets the properties to the default values
            Example = (query2Outer == null ? "Default Value" : query2Outer.Example),
            Title = listItem.GetSPFieldValue("Title"),
            Description = listItem.GetSPFieldValue("Description"),
            DeliveryOrderID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Delivery Order")),
            EstimatedValue = ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0),
            AgreementTypeID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Contract Type")),                                                
        }).FirstOrDefault();

首先,您应该重命名类
Action
,因为
Action
是内置库中定义的委托。我将在下面的代码中使用
MyAction

如果您总是需要从
splistem
获取
MyAction
,那么您最好编写一个扩展方法,将逻辑放在一个地方,以便进行干燥(不要重复)


首先,您应该重命名类
Action
,因为
Action
是内置库中定义的委托。我将在下面的代码中使用
MyAction

如果您总是需要从
splistem
获取
MyAction
,那么您最好编写一个扩展方法,将逻辑放在一个地方,以便进行干燥(不要重复)


扩展方法方法的替代方法是:

public static void SelectFirstInto(this IEnumerable<ContractAction> items, ContractAction target)
{
    var source = items.FirstOrDefault();

    if(source != null)
    {
        target.Title = source.Title,  
        target.Description = source.Description ,  
        target.DeliveryOrderID = source.DeliveryOrderID,  
        target.EstimatedValue = source.EstimatedValue, 
        target.AgreementTypeID = source.AgreementTypeID                                                 
     }
}

请记住,如果列表为空,则目标对象保持不变。这可能是您需要相应处理的问题。

扩展方法的替代方法是:

public static void SelectFirstInto(this IEnumerable<ContractAction> items, ContractAction target)
{
    var source = items.FirstOrDefault();

    if(source != null)
    {
        target.Title = source.Title,  
        target.Description = source.Description ,  
        target.DeliveryOrderID = source.DeliveryOrderID,  
        target.EstimatedValue = source.EstimatedValue, 
        target.AgreementTypeID = source.AgreementTypeID                                                 
     }
}

请记住,如果列表为空,则目标对象保持不变。这可能是您需要相应地处理的事情。

首先,因为我知道我只会得到一个结果,所以我只是想取消使用linq查询的“选择”部分的想法。一旦我这么做了,答案是显而易见的

//just grab the first item
var item = result.GetSPListItems().FirstOrDefault();

//then grab the properties into the existing ContractActionEntity                             
contractAction.Title = item.GetSPFieldValue("Title");
contractAction.Description = item.GetSPFieldValue("Description");
contractAction.DeliveryOrderID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Delivery Order"));
contractAction.EstimatedValue = item.GetSPFieldValue("Estimated Value").ToNullableDouble();
contractAction.AgreementTypeID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Contract Type")),

感谢大家让我更多地思考这个问题,并引导我找到答案。

首先,因为我知道我只会得到一个结果,所以我不得不放弃使用linq查询的“选择”部分的想法。一旦我这么做了,答案是显而易见的

//just grab the first item
var item = result.GetSPListItems().FirstOrDefault();

//then grab the properties into the existing ContractActionEntity                             
contractAction.Title = item.GetSPFieldValue("Title");
contractAction.Description = item.GetSPFieldValue("Description");
contractAction.DeliveryOrderID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Delivery Order"));
contractAction.EstimatedValue = item.GetSPFieldValue("Estimated Value").ToNullableDouble();
contractAction.AgreementTypeID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Contract Type")),

感谢大家让我更多地思考这个问题,并引导我找到答案。

我认为如果
Action
有一些其他属性,并且OP希望其中5个属性被查询修改,并覆盖整个实例,这不是一个好主意。@Danny-OP没有提到如果是这样的话。如果是,他可以在select语句中将现有值分配给新的Action实例。我认为如果
Action
有一些其他属性,并且OP希望其中5个属性被整个实例的intead查询修改,这不是一个好主意。@Danny-OP没有提到如果是这样的话。如果是,,他可以简单地在select语句中将现有值分配给新的操作实例。这与我所寻找的非常接近,但我想消除获取属性然后在现有对象中重新设置属性的冗余。这与我所寻找的非常接近,但我想消除抓取属性,然后在现有对象中再次设置它们。