Creating Comparison and Wildcard Filters for BCS in Visual Studio 2010

Answered Creating Comparison and Wildcard Filters for BCS in Visual Studio 2010

  • Monday, August 20, 2012 2:42 AM
     
     

    I need a step by step approach to Implement Comparison and  Wildcard Filter Descriptor to a Finder Method in Business Data Connectivity Model using Visual Studio 2010. All my columns are strings  How do I pass a string instead of int?. Any example or tutorials will help a lot

     


    Ebenezer

All Replies

  • Monday, August 20, 2012 10:37 AM
     
      Has Code

    Hi Ebenezer,

    Please take a look at this example:

    BDC Model:

    <?xml version="1.0" encoding="utf-8"?>
    <Model Name="BCSMetaManLobSystemModel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/windows/2007/BusinessDataCatalog">
      <LobSystems>
        <LobSystem Name="BCSMetaManLobSystem" Type="DotNetAssembly">
          <LobSystemInstances>
            <LobSystemInstance Name="BCSMetaManLobSystemInstance">
              <Properties>
                <Property Name="ShowInSearchUI" Type="System.String"></Property>
              </Properties>
            </LobSystemInstance>
          </LobSystemInstances>
          <Entities>
            <Entity Name="Territories" Namespace="BCSMetaMan.Model" Version="1.0.0.1">
              <Properties>
                <Property Name="OriginalTableName" Type="System.String">[dbo].[Territories]</Property>
                <Property Name="IsCustomCode" Type="System.Boolean">false</Property>
                <Property Name="Class" Type="System.String">BCSMetaMan.Model.TerritoriesEntityService, BCSMetaManLobSystem</Property>
                <Property Name="Title" Type="System.String">TerritoryID</Property>
              </Properties>
              <Identifiers>
                <Identifier Name="TerritoryID" TypeName="System.String" />
              </Identifiers>
              <Methods>
                <Method Name="GetAllTerritoriesEntitys">
                  <FilterDescriptors>
                    <FilterDescriptor Type="Wildcard" FilterField="TerritoryDescription" Name="MyWildcardFilter" />
                  </FilterDescriptors>
                  <Parameters>
                    <Parameter Name="TerritoryDescription" Direction="In">
                      <TypeDescriptor Name="TerritoryDescription" TypeName="System.String" AssociatedFilter="MyWildcardFilter">
                        <DefaultValues>
                          <DefaultValue MethodInstanceName="GetAllTerritoriesEntitys" Type="System.String">A</DefaultValue>
                        </DefaultValues>
                      </TypeDescriptor>
                    </Parameter>
                    <Parameter Name="returnParameter" Direction="Return">
                      <TypeDescriptor Name="TerritoriesList" TypeName="System.Collections.Generic.IEnumerable`1[[BCSMetaMan.Model.GetAllTerritoriesEntitysProperties, BCSMetaManLobSystem]]" IsCollection="true">
                        <TypeDescriptors>
                          <TypeDescriptor Name="Territories" TypeName="BCSMetaMan.Model.GetAllTerritoriesEntitysProperties, BCSMetaManLobSystem">
                            <TypeDescriptors>
                              <TypeDescriptor Name="TerritoryID" TypeName="System.String" IdentifierName="TerritoryID" ReadOnly="true" />
                              <TypeDescriptor Name="TerritoryDescription" TypeName="System.String" />
                              <TypeDescriptor Name="RegionID" TypeName="System.Int32" />
                            </TypeDescriptors>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </Parameter>
                  </Parameters>
                  <MethodInstances>
                    <MethodInstance Name="GetAllTerritoriesEntitys" DefaultDisplayName="GetAllTerritoriesEntitys" Default="true" Type="Finder" ReturnParameterName="returnParameter" />
                  </MethodInstances>
                </Method>
                <Method Name="GetSingleTerritoriesEntityByID">
                  <Parameters>
                    <Parameter Name="TerritoryID" Direction="In">
                      <TypeDescriptor Name="TerritoryID" TypeName="System.String" IdentifierName="TerritoryID" />
                    </Parameter>
                    <Parameter Name="returnParameter" Direction="Return">
                      <TypeDescriptor Name="Territories" TypeName="BCSMetaMan.Model.GetSingleTerritoriesEntityByIDProperties, BCSMetaManLobSystem">
                        <TypeDescriptors>
                          <TypeDescriptor Name="TerritoryID" TypeName="System.String" IdentifierName="TerritoryID" ReadOnly="true">
                            <Properties>
                              <Property Name="RequiredInForms" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor Name="TerritoryDescription" TypeName="System.String">
                            <Properties>
                              <Property Name="RequiredInForms" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor Name="RegionID" TypeName="System.Int32">
                            <Properties>
                              <Property Name="RequiredInForms" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </Parameter>
                  </Parameters>
                  <MethodInstances>
                    <MethodInstance Name="GetSingleTerritoriesEntityByID" DefaultDisplayName="GetSingleTerritoriesEntityByID" Default="true" Type="SpecificFinder" ReturnParameterName="returnParameter" />
                  </MethodInstances>
                </Method>
              </Methods>
            </Entity>
          </Entities>
        </LobSystem>
      </LobSystems>
    </Model>

    C# code:

    namespace BCSMetaMan.Model
    {
        public class TerritoriesEntityIdentifiers
        {
            [BCSColumnName("TerritoryID"), BCSIsIdentifier(true)]
            public string TerritoryID
            {
                get;
                set;
            }
        }
    
        public class GetAllTerritoriesEntitysProperties : BCSMetaMan.Model.TerritoriesEntityIdentifiers
        {
            [BCSColumnName("TerritoryDescription")]
            public string TerritoryDescription
            {
                get;
                set;
            }
    
            [BCSColumnName("RegionID")]
            public int RegionID
            {
                get;
                set;
            }
        }
    
        public class GetSingleTerritoriesEntityByIDProperties : BCSMetaMan.Model.TerritoriesEntityIdentifiers
        {
            [BCSColumnName("TerritoryDescription")]
            public string TerritoryDescription
            {
                get;
                set;
            }
    
            [BCSColumnName("RegionID")]
            public int RegionID
            {
                get;
                set;
            }
        }
    }
    

    using System.Linq;
    using System.Collections.Generic;
    using System;
    using System.Linq.Expressions;
    
    namespace BCSMetaMan.Model
    {
        [BCSDataSource(BCSDataSourceType.SqlServer)]
        public class TerritoriesEntityService
        {
            public const string ConnectionString = @"Persist Security Info=False; Integrated Security=SSPI; Server=perseus\sharepoint;Connect Timeout=30;Database=Northwind;";
    
            [BcsMethodType(MethodType.Finder)]
            public IEnumerable<GetAllTerritoriesEntitysProperties> GetAllTerritoriesEntitys(string TerritoryDescription)
            {
                var dataContext = new NorthwindContext(ConnectionString);
                var records = from record in dataContext.Territories.Where(MatchesFilterMyWildcardFilter(TerritoryDescription))
                              select new GetAllTerritoriesEntitysProperties
                              {
                                  TerritoryID = record.TerritoryID,
                                  TerritoryDescription = record.TerritoryDescription,
                                  RegionID = record.RegionID
                              };
                return records;
            }
    
            [BcsMethodType(MethodType.SpecificFinder)]
            public GetSingleTerritoriesEntityByIDProperties GetSingleTerritoriesEntityByID(string TerritoryID)
            {
                var dataContext = new NorthwindContext(ConnectionString);
                IEnumerable<GetSingleTerritoriesEntityByIDProperties> records = from record in dataContext.Territories
                                                                                where record.TerritoryID == TerritoryID
                                                                                select new GetSingleTerritoriesEntityByIDProperties
                                                                                {
                                                                                    TerritoryID = record.TerritoryID,
                                                                                    TerritoryDescription = record.TerritoryDescription,
                                                                                    RegionID = record.RegionID
                                                                                };
                return records.FirstOrDefault();
            }
    
            public static Expression<Func<Territories, bool>> MatchesFilterMyWildcardFilter(string WildcardFilter)
            {
                // Remove the * to get inner text for filter comparision
                string filterText = WildcardFilter.Replace("*", "");
    
                // Contains Method
                if (WildcardFilter.StartsWith("*") & WildcardFilter.EndsWith("*"))
                {
                    return (Territories => Territories.TerritoryDescription.Contains(filterText));
                }
                // Ends With
                else if (WildcardFilter.StartsWith("*"))
                {
                    return (Territories => Territories.TerritoryDescription.EndsWith(filterText));
                }
                // Starts With
                else if (WildcardFilter.EndsWith("*"))
                {
                    return (Territories => Territories.TerritoryDescription.StartsWith(filterText));
                }
                // Equals
                else
                {
                    return (Territories => Territories.TerritoryDescription == filterText);
                }
            }
        }
    }
    

    The result on the page:

    You can also try out the product provided by the company where I work for, and name of that product is BCS Meta Man . It will allow you to generate both Database model and C# code automatically as soon as you drag and drop database tables to the design surface.

    It supports the filters for .net assembly model for various data sources.

    Please look at this blog post Create BCS Filters using BCS Meta Man


    Dmitry

    Lightning Tools LogoLightning Tools Check out our SharePoint tools and web parts | Lightning Tools Blog

  • Monday, August 20, 2012 12:29 PM
     
     
    I am not sure what you are trying to do. To advertise the BCS Meta Man which I know off to me or help me understand how I can Implement Filter Descriptors. This example doesn't help me in any shape or form.

    Ebenezer

  • Tuesday, August 21, 2012 11:46 AM
     
     Answered

    Hi Ebenezer,

    I posted the example how to create .net assembly connector with Wildcard filter in Visual Studio. If it's unclear for you please ask here.


    Dmitry

    Lightning Tools LogoLightning Tools Check out our SharePoint tools and web parts | Lightning Tools Blog


  • Tuesday, August 21, 2012 3:05 PM
     
     
    Thanks I got it covered

    Ebenezer