Code Snippet: Implementing a Finder
Applies to: SharePoint Server 2010
In this article
Example for a .NET Connectivity Assembly
Example for an ASP.NET Web Service
Example for a WCF Service
Additional Code Examples
The following code examples show how you can implement a Finder method instance in a .NET connectivity assembly and in a Web service.
Example for a .NET Connectivity Assembly
public Customer[] GetCustomers(String name, int? limit)
{
if (name != "")
{
List<Customer> customersWithName = new List<Customer>();
foreach (Customer customer in customers)
{
//$Name$
if (name.StartsWith("$"))
{
if (name.EndsWith("$"))
{
if (customer.Name.Contains(name.Substring(1,
(name.Length - 2))))
{
customersWithName.Add(customer);
}
}
else
{
if (customer.Name.EndsWith(name.Substring(1,
(name.Length - 1))))
{
customersWithName.Add(customer);
}
}
}
else if (name.EndsWith("$"))
{
if (customer.Name.StartsWith(name.Substring(0,
(name.Length - 1))))
{
customersWithName.Add(customer);
}
}
//Name
else if (customer.Name == name)
{
customersWithName.Add(customer);
}
}
if (limit < 1)
return customersWithName.FindAll(
cust => cust.IsDeleted == false).ToArray();
else
{
int limitvalue = Convert.ToInt32(limit);
List<Customer> limitedcustomers = new List<Customer>();
for (int i = 0; i < limitvalue & i < customersWithName.Count;
i++)
limitedcustomers.Add(customersWithName[i]);
return limitedcustomers.FindAll(
cust => cust.IsDeleted == false).ToArray();
}
}
else
{
if (limit < 1)
return customers.FindAll(
cust => cust.IsDeleted == false).ToArray();
else
{
int limitvalue = Convert.ToInt32(limit);
List<Customer> limitedcustomers = new List<Customer>();
for (int i = 0; i < limitvalue & i < customers.Count; i++)
limitedcustomers.Add(customers[i]);
return limitedcustomers.FindAll(
cust => cust.IsDeleted == false).ToArray();
}
}
}
Example for an ASP.NET Web Service
[WebMethod]
public Customer[] GetCustomers(String name, int? limit)
{
if (name != "")
{
List<Customer> customersWithName = new List<Customer>();
foreach (Customer customer in customers)
{
//$Name$
if (name.StartsWith("$"))
{
if (name.EndsWith("$"))
{
if (customer.Name.Contains(
name.Substring(1, (name.Length - 2))))
{
customersWithName.Add(customer);
}
}
else
{
if (customer.Name.EndsWith(
name.Substring(1, (name.Length - 1))))
{
customersWithName.Add(customer);
}
}
}
else if (name.EndsWith("$"))
{
if (customer.Name.StartsWith(
name.Substring(0, (name.Length - 1))))
{
customersWithName.Add(customer);
}
}
//Name
else if (customer.Name == name)
{
customersWithName.Add(customer);
}
}
if (limit < 1)
return customersWithName.FindAll(
cust => cust.IsDeleted == false).ToArray();
else
{
int limitvalue = Convert.ToInt32(limit);
List<Customer> limitedcustomers = new List<Customer>();
for (int i = 0; i < limitvalue & i < customersWithName.Count;
i++)
limitedcustomers.Add(customersWithName[i]);
return limitedcustomers.FindAll(
cust => cust.IsDeleted == false).ToArray();
}
}
else
{
if (limit <1)
return customers.FindAll(
cust => cust.IsDeleted == false).ToArray();
else
{
int limitvalue = Convert.ToInt32(limit);
List<Customer> limitedcustomers = new List<Customer>();
for (int i = 0; i < limitvalue & i < customers.Count;
i++)
limitedcustomers.Add(customers[i]);
return limitedcustomers.FindAll(
cust => cust.IsDeleted == false).ToArray();
}
}
}
Example for a WCF Service
The following code shows the operation definition in the service contract interface.
[OperationContract]
Customer[] GetCustomers(string name, int? limit);
The following example shows the implementation of the method instance.
public Customer[] GetCustomers(String name, int? limit)
{
if (name != "")
{
List<Customer> customersWithName = new List<Customer>();
foreach (Customer customer in customers)
{
//$Name$
if (name.StartsWith("$"))
{
if (name.EndsWith("$"))
{
if (customer.Name.Contains(
name.Substring(1, (name.Length - 2))))
{
customersWithName.Add(customer);
}
}
else
{
if (customer.Name.EndsWith(
name.Substring(1, (name.Length - 1))))
{
customersWithName.Add(customer);
}
}
}
else if (name.EndsWith("$"))
{
if (customer.Name.StartsWith(
name.Substring(0, (name.Length - 1))))
{
customersWithName.Add(customer);
}
}
//Name
else if (customer.Name == name)
{
customersWithName.Add(customer);
}
}
if (limit < 1)
return customersWithName.FindAll(
cust => cust.IsDeleted == false).ToArray();
else
{
int limitvalue = Convert.ToInt32(limit);
List<Customer> limitedcustomers = new List<Customer>();
for (int i = 0; i < limitvalue & i < customersWithName.Count;
i++)
limitedcustomers.Add(customersWithName[i]);
return limitedcustomers.FindAll(
cust => cust.IsDeleted == false).ToArray();
}
}
else
{
if (limit < 1)
return customers.FindAll(
cust => cust.IsDeleted == false).ToArray();
else
{
int limitvalue = Convert.ToInt32(limit);
List<Customer> limitedcustomers = new List<Customer>();
for (int i = 0; i < limitvalue & i < customers.Count; i++)
limitedcustomers.Add(customers[i]);
return limitedcustomers.FindAll(
cust => cust.IsDeleted == false).ToArray();
}
}
}
Additional Code Examples
External System—Database/SQL Server
For example, for the Contact entity in a Microsoft SQL Server database, the Finder method might look similar to the following.
public static IEnumerable<Contact> ReadList(int itemLimit) { const string ServerName = "MySQLServerName"; AdventureWorksDataContext dataContext = new AdventureWorksDataContext ("Data Source=" + ServerName + ";" + "Initial Catalog=AdventureWorks;Integrated Security=True"); IEnumerable<Contact> Contacts = from contacts in dataContext.Contacts.Take(itemLimit) select contacts; return Contacts; }
The following is a slightly more complex example of a Finder method that has filterable parameters.
SELECT ProductID, Name, ProductNumber, ListPrice FROM Product WHERE (ProductID >= @MinProductID) AND (ProductID <= @MaxProductID) AND (Name LIKE @Name) AND ProductNumber LIKE @ProductNumber)
External System—Flat File
public static IEnumerable<FlatFileEntity> ReadList() { List<FlatFileEntity> flatFileEntityList = new List<FlatFileEntity>(); TextReader textReader = new StreamReader(@"c:\data\flat-file-data-source.txt"); string row; while ((row = textReader.ReadLine()) != null) { FlatFileEntity flatFileEntity = new FlatFileEntity(); string[] entityData = row.Split(','); flatFileEntity.ID = entityData[0]; flatFileEntity.Company = entityData[1]; flatFileEntity.FirstName = entityData[2]; flatFileEntity.LastName = entityData[3]; flatFileEntity.Address = entityData[4]; flatFileEntity.City = entityData[5]; flatFileEntity.State = entityData[6]; flatFileEntity.ZipCode = entityData[7]; flatFileEntity.Phone = entityData[8]; flatFileEntity.LastUpdated = DateTime.Parse(entityData[9]); flatFileEntityList.Add(flatFileEntity); } textReader.Close(); return flatFileEntityList.toArray(); }
Paging Sample
public static IEnumerable<Document> ReadFolder( string parentFolderID, int pageNumber) { //Required to allow SQL CE to work in an ASP.NET environment AppDomain.CurrentDomain.SetData( "SQLServerCompactEditionUnderWebHosting", true); DMSEntities ctx = new DMSEntities(connString); int tid = int.Parse(parentFolderID); string username = GetCurrentDMSUsername(); /* SQL CE does not support paging so we must return all results, create an anonymous type, and then take the page. In production, you would do this all in a single LINQ statement. */ var a = ((from d in ctx.Documents where (d.ParentId == tid) select new { d.Name, d.Id, d.ParentId, d.IsFolder }). OrderBy(d => !d.IsFolder)).ToList(); //Get authorized documents by page. var p = a.Where(c => IsAuthorized(username, c.Id) == true). Skip((pageNumber - 1) * PageSize).Take(PageSize); List<Document> docs = new List<Document>(); foreach (var i in p) { Document doc = new Document(); doc.ID = i.Id.ToString(); doc.Name = i.Name; doc.ParentID = i.ParentId.ToString(); if (i.IsFolder) doc.Type = "Folder"; else doc.Type = "Document"; doc.Version = "Published"; docs.Add(doc); } return docs; }