Как использовать LINQ для запроса из списка объектов в существующий объект? - PullRequest
1 голос
/ 15 ноября 2010

Я не уверен, возможно ли это в LINQ, но у меня есть следующий сценарий:

Я звоню в службу списков SharePoint несколько раз с несколькими запросами. Затем я заполняю один объект и его свойства из всех запросов. Я использую LINQ для запроса возвращенного XElement. Я знаю, что если вызов дойдет до этой точки, из моего запроса LINQ будет возвращен только один элемент. В настоящее время мне нужно запросить новый объект и затем установить свойства моего основного объекта из этого нового объекта (из LINQ) для каждого вызова веб-службы. (В приведенном ниже примере кода содержится лишь небольшая часть свойств элемента «Действие», которые необходимо будет запросить и установить.)

Есть ли способ сделать приведенный ниже оператор '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;

Ответы [ 5 ]

1 голос
/ 18 ноября 2010

Во-первых, поскольку я знаю, что у меня будет только один результат, мне просто нужно было отказаться от идеи использования части select в запросе 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")),

Спасибо всем за то, что заставили меня больше думать о проблеме и направили меня в направлении ответа.

1 голос
/ 15 ноября 2010

Во-первых, вы должны переименовать класс Action, поскольку Action является определенным делегатом во встроенной библиотеке.Я буду использовать MyAction в следующем коде.

И если вам всегда нужно получить MyAction из SPListItem, вам лучше написать метод расширения, чтобы поместить логику в одно место для DRY(Не повторяйте себя).

public static MyAction ToMyAction(this SPListItem item)
{
    return new MyAction  
       {  
          Title = item.GetSPFieldValue("Title"),  
          Description = item.GetSPFieldValue("Description"),  
          DeliveryOrderID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Delivery Order")),  
          EstimatedValue = ((item.GetSPFieldValue("Estimated Value") as double?) ?? 0),  
          AgreementTypeID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Contract Type"))                                                  
       };  
}

var action = result.GetSPListItems()
                   .Select(item => item.ToMyAction())
                   .FirstOrDefault();
//var action = (from item in result.GetSPListItems()
//              select item.ToMyAction()).FirstOrDefault();
1 голос
/ 15 ноября 2010

Разве вы не можете просто:

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();
0 голосов
/ 15 ноября 2010

Альтернативой подходу методов расширения будет:

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                                                 
     }
}

Тогда вы можете сделать:

ContractAction targetAction = new ContractAction();
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")),                                                
            }).SelectFirstInto(targetAction);

Имейте в виду, что если список пуст, то целевой объектостается неизменным.Это может быть то, что вы захотите соответственно обработать.

0 голосов
/ 15 ноября 2010

Вы можете написать свои запросы в один большой запрос. Так, например, вы могли бы иметь:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...