2017-12-15 4 views
0

Ich stecke fest, versuchen, meine Ergebnisse zwischen einem Datumsbereich zu begrenzen. Ich verbinde mich über CSOM mit SharePoint. Die SharePoint-Version, die ich denke, ist SharePoint Online (wir haben Office 365 bei der Arbeit).Feldwert für Linq-Abfrage erhalten - SharePoint

Grundsätzlich möchte ich die Daten für die Abfrage unten beschränken. Ich möchte die Start_Date < = Heute und die End_Date> = Heute. Mehr als das verstehe ich nicht ganz, wie man den Wert eines Feldes mit linq zurückgibt.

Ich habe diese:

.Where(x => x.Id <= 50)

, die richtig funktioniert. Das war einfach, da ich die Eigenschaft Id mit Intellisense finden konnte, aber ich kann nicht herausfinden, wie ich die Felder herausziehen kann, an denen ich interessiert bin und wie man linq verwendet, um meine Ergebnisse mit einem zusätzlichen Where einzuschränken.

Im Moment bekomme ich folgende Fehler versucht, meinen Code auszuführen wie:

The 'ToDateTime' member cannot be used in the expression.

Relevante Code:

private ListItemCollection GetSharePointList(string XML, string tableName, ClientContext context, byte limit = 50) 
    { 
     List testTable = context.Web.Lists.GetByTitle(tableName); 

     CamlQuery camlQuery = new CamlQuery 
     { 
      ViewXml = XML //The Passed in XML is: "<view></view>" 
     }; 

     ListItemCollection GetSharePointList = testTable.GetItems(camlQuery); 
     DateTime today = DateTime.Today; 

     context.Load(GetSharePointList, 
     items => items.Take(limit).Include(
       item => item.Id, 
       item => item["DayOfMonth"], 
       item => item["Start_Date"], 
       item => item["End_Date"], 
       item => item["Task_FrequencyID_x003a_Frequency"], 
       item => item["TaskID_x003a_TaskName"], 
       item => item["TaskID_x003a_TaskAlias"], 
       item => item["TaskID_x003a_TaskDueTime"], 
       item => item["Daily_Frequency_x003a_DayofWeek"], 
       item => item["Weekly_Frequency_x003a_Week"], 
       item => item["End_Date"], 
       item => item["Monthly_Frequency"]) 
         .Where(x => x.Id <= 50) 
         .Where(y => Convert.ToDateTime(y.FieldValues["Start_Date"]) <= today)); 

     context.ExecuteQuery(); 
     return GetSharePointList; 
    } 
+0

Sollte so etwas wie .Select (x => x.Field ("start_date")) – jdweng

+0

sein @ jdweng Danke. Ich bekomme "ListItem enthält keine Definition für 'Field' ..." irgendwelche Ideen? –

+0

Das Feld ist ein Objekt, das ein Tippfehler sein kann. Ohne den Typ zu kennen, kann ich keine Antwort geben. Das Element ist möglicherweise bereits eine DateTime, sodass keine Konvertierung erforderlich ist. – jdweng

Antwort

1

Um die Ergebnisse zwischen start_date zu beschränken < = Heute und the End_Date> = Heute müssen Sie die CAML-Abfrage verwenden. So funktioniert es in SharePoint.

So müssen Sie Ihren Code wie unten ändern:

List testTable = context.Web.Lists.GetByTitle(tableName); 

var viewQuery = string.Format(@"<View> 
    <Query> 
     <Where> 
     <And>   
     <Leq> 
      <FieldRef Name='Start_Date' /> 
      <Value Type='DateTime'><Today /></Value> 
     </Leq> 
     <Geq> 
      <FieldRef Name='End_Date' /> 
      <Value Type='DateTime'><Today /></Value> 
     </Geq> 
     </And> 
    </Where> 
    </Query> 
</View>"); 

CamlQuery camlQuery = new CamlQuery 
{ 
    ViewXml = viewQuery; 
}; 

ListItemCollection GetSharePointList = testTable.GetItems(camlQuery); 

context.Load(GetSharePointList, 
    items => items.Include(
    item => item.Id, 
    item => item["DayOfMonth"], 
    item => item["Start_Date"], 
    item => item["End_Date"], 
    item => item["Task_FrequencyID_x003a_Frequency"], 
    item => item["TaskID_x003a_TaskName"], 
    item => item["TaskID_x003a_TaskAlias"], 
    item => item["TaskID_x003a_TaskDueTime"], 
    item => item["Daily_Frequency_x003a_DayofWeek"], 
    item => item["Weekly_Frequency_x003a_Week"], 
    item => item["End_Date"], 
    item => item["Monthly_Frequency"])); 
context.ExecuteQuery(); 

foreach(ListItem spListItem in GetSharePointList){ 
    //do something with the data 
} 

Referenz - Retrieve list items using CSOM C#

+0

Danke Gautam. Ich würde es vorziehen, die Liste zu beschränken, wenn möglich mit Linq. Können Sie das nur mit einer CAML-Abfrage erreichen? –

+0

Ja, um die Ergebnisse einzuschränken, müssen Sie nur die CAML-Abfrage verwenden. –

+0

Warum hat '.Where (x => x.Id <= 50)' arbeiten, um diese Datensätze zu beschränken, wenn Sie nur mit CAML einschränken können? –

Verwandte Themen