EntityFramework.Functions: Code First Functions for Entity Framework

EntityFramework.Functions library implements Entity Framework code first support for:

  • Stored procedures, with:
    • single result type
    • multiple result types
    • output parameter
  • Table-valued functions, returning
    • entity type
    • complex type
  • Scalar-valued functions
    • composable
    • non-composable
  • Aggregate functions
  • Built-in functions
  • Niladic functions
  • Model defined functions

EntityFramework.Functions library works on .NET Standard with Entity Framework 6.4.0. It also works on .NET 4.0, .NET 4.5, .NET 4.6, .NET 4.7, .NET 4.8 with Entity Framework 6.1.0 and later. Entity Framework is the only dependency of this library.

It can be installed through Nuget:

dotnet add package EntityFramework.Functions

or:

Install-Package EntityFramework.Functions -DependencyVersion Highest

See:

Source code

The source can be opened and built in Visual Studio 2015.

Nuget package project is used to build the nuget package from a .nuproj. It is already included in the source.

To view the sample database, or run the unit test against the sample database, please install SQL Server 2014 LocalDB or SQL Server 2016 LocalDB.

APIs

EntityFramework.Functions library provides a few simple APIs, following the pattern of Entity Framework and LINQ to SQL.

[Function]

[Function(FunctionType type, string name)] attribute derives from DbFunctionAttribute provided in Entity Framework. It is also similar to FunctionAttribute in LINQ to SQL. When a method is tagged with [Function], it maps to a database function or stored procedure. The FunctionType parameter is an enumeration, with the following members:

  • StoredProcedure
  • TableValuedFunction
  • ComposableScalarValuedFunction
  • NonComposableScalarValuedFunction
  • AggregateFunction
  • BuiltInFunction,
  • NiladicFunction,
  • ModelDefinedFunction

Examples for each function type can be found below.

The other name parameter specifies the database function/stored procedure that is mapped to. Even when C# method name is exactly the same as the mapped database function/stored procedure, this name string still has to be provided. This is required by Entity Framework.

[Function] has 2 settable properties:

  • Schema: It specifies the schema of the mapped database function/stored procedure, e.g. “dbo”.
  • ParameterTypeSemantics: It is of ParameterTypeSemantics type provided in Entity Framework. It defines the type semantics used to resolve function overloads. ParameterTypeSemantics is an enumeration of 3 members:
    • AllowImplicitConversion (the default)
    • AllowImplicitPromotion
    • ExactMatchOnly

Besides general [Function] attribute, a specific attribute is also provided for each function type:

  • [StoredProcedure]
  • [TableValuedFunction]
  • [ComposableScalarValuedFunction]
  • [NonComposableScalarValuedFunction]
  • [AggregateFunction]
  • [BuiltInFunction]
  • [NiladicFunction]
  • [ModelDefinedFunction]

[Parameter]

[Parameter] tags the function parameter to specify the mapped database function/stored procedure’s parameter name and type. It is similar to ParameterAttribute in LINQ to SQL.

[Parameter] has 3 settable properties:

  • Name: the name of the mapped parameter in database.
  • DbType: the tyoe of the mapped parameter in database, like “money”
  • ClrType: the type of the mapping .NET parameter.
    • In Entity Framework, when a parameter is a output parameter, it has to be of ObjectParameter type. In this case, the mapping CLR type cannot be predicted and has to be provided by [Parameter]’s ClrType property.
    • In other cases, ClrType property can be omitted. At runtime, If ClrType conflicts with CLR parameter’s actual declaration CLR type, an exception will be thrown.

[Parameter] can be omitted. when:

  • the parameter is not an output parameter
  • and its name is the same as the mapped database parameter

[Parameter] can also be used to tag the return value of method, to specify the DbType of the mapped database function return value, which is also the same as LINQ to SQL. Please see examples below.

[ResultType]

[ResultType(Type type)] is exactly the same as ResultTypeAttribute in LINQ to SQL. Its constructor accepts a Type parameter to specify the return type of stored procedure. Typically, when the stored procedure has multiple result types, the mapping method can be tagged with multiple [ResultType]s.

[ResultType] cannot be used for functions.

FunctionConvention and FunctionConvention<TFunctions>

FunctionConvention and FunctionConvention<TFunctions> implements Entity Framework’s IStoreModelConvention<EntityContainer> contract. They must be added to specify in what Type the mapping methods are located.

When the functions are added to entity model, the entity types and complex types used by functions should be added to entity model too. Entity Framework does not take care of types tagged with [ComplexType], so this library provides a AddComplexTypesFromAssembly extension method for this.

For convenience, 2 extension methods AddFunctions/AddFunction<TFunctions> are provided. When they are called:

  • FunctionConvention/FunctionConvention<TFunctions> is added to entity model.
  • AddComplexTypesFromAssembly is automatically called. In the assembly of TFunction, types tagged with [ComplextType] are added to entity model.

Examples

The following examples uses Microsoft’s AdventureWorks sample database for SQL Server 2014. The database can also be found in this library’s source repository on GitHub.

Add functions to entity model

Before calling any code first function, FunctionConvention or FunctionConvention<TFunctions> must be added to DbModelBuilder of the DbContext, so are the complex types used by functions:

public partial class AdventureWorks : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // Add functions on AdventureWorks to entity model.
        modelBuilder.Conventions.Add(new FunctionConvention<AdventureWorks>());

        // Add all complex types used by functions.
        modelBuilder.ComplexType<ContactInformation>();
        modelBuilder.ComplexType<ManagerEmployee>();
        // ...
    }
}

Here new FunctionConvention<T>() is equivalent to new FunctionConvention(typeof(T)). The non-generic version is provided because in C# static class cannot be used as type argument:

public partial class AdventureWorks : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // Add functions on AdventureWorks and StaticClass to entity model.
        modelBuilder.Conventions.Add(new FunctionConvention<AdventureWorks>());
        modelBuilder.Conventions.Add(new FunctionConvention(typeof(StaticClass)));

        // Add all complex types in the assembly of AdventureWorks.
        modelBuilder.AddComplexTypesFromAssembly(typeof(AdventureWorks).Assembly);
    }
}

Also, AddFunctions/AddFunction<TFunctions> extension methods are provided as a shortcut, which automatically add all complex types in the assembly of TFunctions.

public partial class AdventureWorks : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // Add functions and complex types to model.
        modelBuilder.AddFunctions<AdventureWorks>();
        modelBuilder.AddFunctions(typeof(AdventureWorksFunctions));
        modelBuilder.AddFunctions(typeof(BuiltInFunctions));
        modelBuilder.AddFunctions(typeof(NiladicFunctions));
    }
}

Stored procedure, with single result type

The AdventureWorks database has a sample stored procedure uspGetManagerEmployees. Its return type can be viewed with dm_exec_describe_first_result_set:

SELECT *
FROM sys.dm_exec_describe_first_result_set(N'dbo.uspGetManagerEmployees', NULL, 0);

image

An entity type or a complex type can be defined to represent above return type:

[ComplexType]
public class ManagerEmployee
{
    public int? RecursionLevel { get; set; }

    public string OrganizationNode { get; set; }

    public string ManagerFirstName { get; set; }

    public string ManagerLastName { get; set; }

    public int? BusinessEntityID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

It is tagged with [ComplexType], which is provided in System.ComponentModel.DataAnnotations.dll, and used by Entity Framework. When calling AddFunctions(typeof(TFunctions))/AddFunction<TFunctions>(), types tagged with [ComplexType] in the same assembly are added to entity model too.

Now the mapping method can be defined:

public partial class AdventureWorks
{
    public const string dbo = nameof(dbo);

    // Defines stored procedure returning a single result type: 
    // - a ManagerEmployee sequence.
    [Function(FunctionType.StoredProcedure, nameof(uspGetManagerEmployees), Schema = dbo)]
    public ObjectResult<ManagerEmployee> uspGetManagerEmployees(int? BusinessEntityID)
    {
        ObjectParameter businessEntityIdParameter = BusinessEntityID.HasValue
            ? new ObjectParameter(nameof(BusinessEntityID), BusinessEntityID)
            : new ObjectParameter(nameof(BusinessEntityID), typeof(int));

        return this.ObjectContext().ExecuteFunction<ManagerEmployee>(
            nameof(this.uspGetManagerEmployees), businessEntityIdParameter);
    }
}

In its body, it should call ExecuteFunction on ObjectContext. Here ObjectContext method is an extension method provided by this library.

Then it can be called as following:

[TestMethod]
public void CallStoredProcedureWithSingleResult()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        ObjectResult<ManagerEmployee> employees = database.uspGetManagerEmployees(2);
        Assert.IsTrue(employees.Any());
    }
}

The above call is translated to the following SQL, which can be viewed with SQL Server Profiler:

exec [dbo].[uspGetManagerEmployees] @BusinessEntityID=2

Stored procedure, with output parameter

As fore mentioned, stored procedure’s output parameter is represented by ObjectParameter and must be tagged with [Parameter], with ClrType provided:

private const string uspLogError = nameof(uspLogError);

// Defines stored procedure accepting an output parameter.
// Output parameter must be ObjectParameter, with ParameterAttribute.ClrType provided.
[Function(FunctionType.StoredProcedure, uspLogError, Schema = dbo)]
public int LogError([Parameter(DbType = "int", ClrType = typeof(int))]ObjectParameter ErrorLogID) =>
    this.ObjectContext().ExecuteFunction(uspLogError, ErrorLogID);

Then it can be called as:

[TestMethod]
public void CallStoreProcedureWithOutParameter()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        ObjectParameter errorLogId = new ObjectParameter("ErrorLogID", typeof(int)) { Value = 5 };
        int? rows = database.LogError(errorLogId);
        Assert.AreEqual(0, errorLogId.Value);
        Assert.AreEqual(typeof(int), errorLogId.ParameterType);
        Assert.AreEqual(-1, rows);
    }
}

The call is translated to:

declare @p1 int
set @p1=0
exec [dbo].[uspLogError] @ErrorLogID=@p1 output
select @p1

Stored procedure, with multiple result types

The following stored procedure returns 2 different types of results: a sequence of ProductCategory row(s), and a sequence of ProductSubcategory row(s).

CREATE PROCEDURE [dbo].[uspGetCategoryAndSubCategory]
    @CategoryID int
AS
BEGIN
    SELECT [Category].[ProductCategoryID], [Category].[Name]
        FROM [Production].[ProductCategory] AS [Category] 
        WHERE [Category].[ProductCategoryID] = @CategoryID;

    SELECT [Subcategory].[ProductSubcategoryID], [Subcategory].[Name], [Subcategory].[ProductCategoryID]
        FROM [Production].[ProductSubcategory] As [Subcategory]
        WHERE [Subcategory].[ProductCategoryID] = @CategoryID;
END
GO

The involved ProductCategory table and ProductSubcategory table  can be represented as:

public partial class AdventureWorks
{
    public const string Production = nameof(Production);

    public DbSet<ProductCategory> ProductCategories { get; set; }

    public DbSet<ProductSubcategory> ProductSubcategories { get; set; }
}

[Table(nameof(ProductCategory), Schema = AdventureWorks.Production)]
public partial class ProductCategory
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductCategoryID { get; set; }

    [MaxLength(50)]
    public string Name { get; set; }
}

[Table(nameof(ProductSubcategory), Schema = AdventureWorks.Production)]
public partial class ProductSubcategory
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductSubcategoryID { get; set; }

    [MaxLength(50)]
    public string Name { get; set; }
}

Above ProductCategory and ProductSubcategory classes are tagged with [Table], so they will be added to entity model automatically by Entity Framework.

Multiple return types can be specified by [ReturnType]. The return type defined on the method will be merged into the return types from [ReturnType]s, and be at the first position:

// Defines stored procedure returning multiple result types: 
// - a ProductCategory sequence.
// - a ProductSubcategory sequence.
[Function(FunctionType.StoredProcedure, nameof(uspGetCategoryAndSubCategory), Schema = dbo)]
[ResultType(typeof(ProductCategory))]
[ResultType(typeof(ProductSubcategory))]
public ObjectResult<ProductCategory> uspGetCategoryAndSubCategory(int CategoryID)
{
    ObjectParameter categoryIdParameter = new ObjectParameter(nameof(CategoryID), CategoryID);
    return this.ObjectContext().ExecuteFunction<ProductCategory>(
        nameof(this.uspGetCategoryAndSubCategory), categoryIdParameter);
}

Then it can be called to retrieve one ProductCategory sequence, and one ProductSubcategory sequence:

[TestMethod]
public void CallStoreProcedureWithMultipleResults()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        // The first type of result type: a sequence of ProductCategory objects.
        ObjectResult<ProductCategory> categories = database.uspGetCategoryAndSubCategory(1);
        Assert.IsNotNull(categories.Single());
        // The second type of result type: a sequence of ProductCategory objects.
        ObjectResult<ProductSubcategory> subcategories = categories.GetNextResult<ProductSubcategory>();
        Assert.IsTrue(subcategories.Any());
    }
}

The SQL translation is normal:

exec [dbo].[uspGetCategoryAndSubCategory] @CategoryID=1

Table-valued function

The AdventureWorks sample database has a table-valued function, dbo.ufnGetContactInformation, its return type can be also represented as another complex type:

[ComplexType]
public class ContactInformation
{
    public int PersonID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string JobTitle { get; set; }

    public string BusinessEntityType { get; set; }
}

Then the ufnGetContactInformation function can be mapped by:

// Defines table-valued function, which must return IQueryable<T>.
[Function(FunctionType.TableValuedFunction, nameof(ufnGetContactInformation), Schema = dbo)]
public IQueryable<ContactInformation> ufnGetContactInformation(
    [Parameter(DbType = "int", Name = "PersonID")]int? personId)
{
    ObjectParameter personIdParameter = personId.HasValue
        ? new ObjectParameter("PersonID", personId)
        : new ObjectParameter("PersonID", typeof(int));

    return this.ObjectContext().CreateQuery<ContactInformation>(
        $"[{nameof(this.ufnGetContactInformation)}](@{nameof(personId)})", personIdParameter);
}

Its return type should be IQueryable<T>, so that it is composable in LINQ to Entities. And it can be called:

[TestMethod]
public void CallTableValuedFunction()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        IQueryable<ContactInformation> employees = database.ufnGetContactInformation(1).Take(2);
        Assert.IsNotNull(employees.Single());
    }
}

The above ufnGetContactInformation call and Take call will be translated to one single SQL query:

exec sp_executesql N'SELECT TOP (2) 
    [top].[C1] AS [C1], 
    [top].[PersonID] AS [PersonID], 
    [top].[FirstName] AS [FirstName], 
    [top].[LastName] AS [LastName], 
    [top].[JobTitle] AS [JobTitle], 
    [top].[BusinessEntityType] AS [BusinessEntityType]
    FROM ( SELECT TOP (2) 
        [Extent1].[PersonID] AS [PersonID], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[JobTitle] AS [JobTitle], 
        [Extent1].[BusinessEntityType] AS [BusinessEntityType], 
        1 AS [C1]
        FROM [dbo].[ufnGetContactInformation](@PersonID) AS [Extent1]
    )  AS [top]',N'@PersonID int',@PersonID=1

Scalar-valued function, non-composable

For scalar-valued function. the return value becomes a primitive non-collection type.

// Defines scalar-valued function (non-composable), 
// which cannot be used in LINQ to Entities queries;
// and can be called directly.
[Function(FunctionType.NonComposableScalarValuedFunction, nameof(ufnGetProductStandardCost), Schema = dbo)]
[return: Parameter(DbType = "money")]
public decimal? ufnGetProductStandardCost(
    [Parameter(DbType = "int")]int ProductID,
    [Parameter(DbType = "datetime")]DateTime OrderDate)
{
    ObjectParameter productIdParameter = new ObjectParameter(nameof(ProductID), ProductID);
    ObjectParameter orderDateParameter = new ObjectParameter(nameof(OrderDate), OrderDate);
    return this.ObjectContext().ExecuteFunction<decimal?>(
        nameof(this.ufnGetProductStandardCost), productIdParameter, orderDateParameter).SingleOrDefault();
}

In this case, [Parameter] can tag its return type.

It can be called directly just like other above methods:

[TestMethod]
public void CallNonComposableScalarValuedFunction()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        decimal? cost = database.ufnGetProductStandardCost(999, DateTime.Now);
        Assert.IsNotNull(cost);
        Assert.IsTrue(cost > 1);
    }
}

And the translated SQL is:

exec sp_executesql N'SELECT [dbo].[ufnGetProductStandardCost](@ProductID, @OrderDate)',N'@ProductID int,@OrderDate datetime2(7)',@ProductID=999,@OrderDate='2015-12-28 02:22:53.0353800'

However, since it is specified to be non-composable, it cannot be translated by Entity Framework in LINQ to Entities queries:

[TestMethod]
public void NonComposableScalarValuedFunctionInLinq()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        try
        {
            database
                .Products
                .Where(product => product.ListPrice >= database.ufnGetProductStandardCost(999, DateTime.Now))
                .ToArray();
            Assert.Fail();
        }
        catch (NotSupportedException)
        {
        }
    }
}

This is by design of Entity Framework.

Scalar-valued function, composable

The composable scalar-valued function is very similar:

// Defines scalar-valued function (composable),
// which can only be used in LINQ to Entities queries, where its body will never be executed;
// and cannot be called directly.
[Function(FunctionType.ComposableScalarValuedFunction, nameof(ufnGetProductListPrice), Schema = dbo)]
[return: Parameter(DbType = "money")]
public decimal? ufnGetProductListPrice(
    [Parameter(DbType = "int")] int ProductID,
    [Parameter(DbType = "datetime")] DateTime OrderDate) => 
        Function.CallNotSupported<decimal?>();

The difference is, it works in LINQ to Entities queries, but cannot be called directly. As a result, its body will never be executed. So in the body, it can just throw an exception. This library provides a Function.,CallNotSupported help methods for convenience, which just throws a NotSupportedException.

[TestMethod]
public void ComposableScalarValuedFunctionInLinq()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        IQueryable<Product> products = database
            .Products
            .Where(product => product.ListPrice <= database.ufnGetProductListPrice(999, DateTime.Now));
        Assert.IsTrue(products.Any());
    }
}

[TestMethod]
public void CallComposableScalarValuedFunction()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        try
        {
            database.ufnGetProductListPrice(999, DateTime.Now);
            Assert.Fail();
        }
        catch (NotSupportedException)
        {
        }
    }
}

The above LINQ query, containing composable scalar-valued function, is translated to:

SELECT 
    CASE WHEN ( EXISTS (SELECT 
        1 AS [C1]
        FROM [Production].[Product] AS [Extent1]
        WHERE [Extent1].[ListPrice] <= ([dbo].[ufnGetProductListPrice](999, SysDateTime()))
    )) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT 
        1 AS [C1]
        FROM [Production].[Product] AS [Extent2]
        WHERE [Extent2].[ListPrice] <= ([dbo].[ufnGetProductListPrice](999, SysDateTime()))
    )) THEN cast(0 as bit) END AS [C1]
    FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]

Aggregate function

To demonstrate the mapping of user defined aggregate, the following aggregate function can be defined:

[Serializable]
[SqlUserDefinedAggregate(
    Format.UserDefined,
    IsInvariantToNulls = true,
    IsInvariantToDuplicates = false,
    IsInvariantToOrder = false,
    MaxByteSize = 8000)]
public class Concat : IBinarySerialize
{
    private const string Separator = ", ";

    private StringBuilder concat;

    public void Init()
    {
    }

    public void Accumulate(SqlString sqlString) => this.concat = this.concat?
        .Append(Separator).Append(sqlString.IsNull ? null : sqlString.Value)
        ?? new StringBuilder(sqlString.IsNull ? null : sqlString.Value);

    public void Merge(Concat concat) => this.concat.Append(concat.concat);

    public SqlString Terminate() => new SqlString(this.concat?.ToString());

    public void Read(BinaryReader reader) => this.concat = new StringBuilder(reader.ReadString());

    public void Write(BinaryWriter writer) => writer.Write(this.concat?.ToString() ?? string.Empty);
}

Concat takes 1 parameter, just like COUNT(), SUM(), etc. The following ConcatWith aggregate function accepts 2 parameters, a value and a separator:

[Serializable]
[SqlUserDefinedAggregate(
    Format.UserDefined,
    IsInvariantToNulls = true,
    IsInvariantToDuplicates = false,
    IsInvariantToOrder = false,
    MaxByteSize = 8000)]
public class ConcatWith : IBinarySerialize
{
    private StringBuilder concatWith;

    public void Init()
    {
    }

    public void Accumulate(SqlString sqlString, SqlString separator) => this.concatWith = this.concatWith?
        .Append(separator.IsNull ? null : separator.Value)
        .Append(sqlString.IsNull ? null : sqlString.Value)
        ?? new StringBuilder(sqlString.IsNull ? null : sqlString.Value);

    public void Merge(ConcatWith concatWith) => this.concatWith.Append(concatWith.concatWith);

    public SqlString Terminate() => new SqlString(this.concatWith?.ToString());

    public void Read(BinaryReader reader) => this.concatWith = new StringBuilder(reader.ReadString());

    public void Write(BinaryWriter writer) => writer.Write(this.concatWith?.ToString() ?? string.Empty);
}

Build these 2 classes into a .NET assembly, and add to database:

-- Create assembly.
CREATE ASSEMBLY [Dixin.Sql] 
FROM N'D:\OneDrive\Works\Drafts\CodeSnippets\Dixin.Sql\bin\Debug\Dixin.Sql.dll';
GO

-- Create aggregate from assembly.
CREATE AGGREGATE [Concat] (@value nvarchar(4000)) RETURNS nvarchar(max)
EXTERNAL NAME [Dixin.Sql].[Dixin.Sql.Concat];
GO

CREATE AGGREGATE [ConcatWith] (@value nvarchar(4000), @separator nvarchar(40)) RETURNS nvarchar(max)
EXTERNAL NAME [Dixin.Sql].[Dixin.Sql.ConcatWith];
GO

Now Concat and ConcatWith can be used in SQL:

SELECT [Subcategory].[ProductCategoryID], COUNT([Subcategory].[Name]), [dbo].[Concat]([Subcategory].[Name])
FROM [Production].[ProductSubcategory] AS [Subcategory]
GROUP BY [Subcategory].[ProductCategoryID];

SELECT [dbo].[Concat](Name) FROM Production.ProductCategory;

SELECT [Subcategory].[ProductCategoryID], COUNT([Subcategory].[Name]), [dbo].[ConcatWith]([Subcategory].[Name], N' | ')
FROM [Production].[ProductSubcategory] AS [Subcategory]
GROUP BY [Subcategory].[ProductCategoryID];

SELECT [dbo].[ConcatWith](Name, N' | ') FROM Production.ProductCategory;

To map them in C#, the following methods can be defined:

public static class AdventureWorksFunctions
{
    // Defines aggregate function, which must have one singele IEnumerable<T> or IQueryable<T> parameter.
    // It can only be used in LINQ to Entities queries, where its body will never be executed;
    // and cannot be called directly.
    [Function(FunctionType.AggregateFunction, nameof(Concat), Schema = AdventureWorks.dbo)]
    public static string Concat(this IEnumerable<string> value) => Function.CallNotSupported<string>();

    // Aggregate function with more than more parameter is not supported by Entity Framework.
    // The following cannot to translated in LINQ queries.
    // [Function(FunctionType.AggregateFunction, nameof(ConcatWith), Schema = AdventureWorks.dbo)]
    // public static string ConcatWith(this IEnumerable<string> value, string separator) => 
    //    Function.CallNotSupported<string>();
}

Apparently, aggregate functions cannot be called directly, so their bodies just throw exception. Unfortunately, above ConcatWith cannot be translated, because currently Entity Framework does not support aggregate function with more than one parameters.

They are defined as extension methods of IEnumerable<T>, so that they can easily be used in LINQ to :

[TestMethod]
public void AggregateFunctionInLinq()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        var categories = database.ProductSubcategories
            .GroupBy(subcategory => subcategory.ProductCategoryID)
            .Select(category => new
            {
                CategoryId = category.Key,
                SubcategoryNames = category.Select(subcategory => subcategory.Name).Concat()
            })
            .ToArray();
        Assert.IsTrue(categories.Length > 0);
        categories.ForEach(category =>
            {
                Assert.IsTrue(category.CategoryId > 0);
                Assert.IsFalse(string.IsNullOrWhiteSpace(category.SubcategoryNames));
            });
    }
}

Above query will be translated to SQL with Concat call:

SELECT 
    1 AS [C1], 
    [GroupBy1].[K1] AS [ProductCategoryID], 
    [GroupBy1].[A1] AS [C2]
    FROM ( SELECT 
        [Extent1].[ProductCategoryID] AS [K1], 
        [dbo].[Concat]([Extent1].[Name]) AS [A1]
        FROM [Production].[ProductSubcategory] AS [Extent1]
        GROUP BY [Extent1].[ProductCategoryID]
    )  AS [GroupBy1]

The reason is Entity Framework does not support aggregate function with more than one parameters.

Built-in function

SQL Server provides a lot of built-in functions. They can be easily represented with [Function] tag. Take LEFT function as example:

It is a string function, returns the left part of a string with the specified number of characters. So, in C#, just defines a function accepting a string parameter and a int parameter, and returns a string:

public static class BuiltInFunctions
{
    [Function(FunctionType.BuiltInFunction, "LEFT")]
    public static string Left(this string value, int count) => Function.CallNotSupported<string>();
}

Again, it can only be used in LINQ to Entities and cannot be called directly. So in its body, it just simply throw an exception. It is implemented as an extension method of string, for convenience.

[TestMethod]
public void BuitInFunctionInLinq()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        var categories = database.ProductSubcategories
            .GroupBy(subcategory => subcategory.ProductCategoryID)
            .Select(category => new
            {
                CategoryId = category.Key,
                SubcategoryNames = category.Select(subcategory => subcategory.Name.Left(4)).Concat()
            })
            .ToArray();
        Assert.IsTrue(categories.Length > 0);
        categories.ForEach(category =>
        {
            Assert.IsTrue(category.CategoryId > 0);
            Assert.IsFalse(string.IsNullOrWhiteSpace(category.SubcategoryNames));
        });
    }
}

The above query is translated to SQL with LEFT call:

SELECT 
    1 AS [C1], 
    [GroupBy1].[K1] AS [ProductCategoryID], 
    [GroupBy1].[A1] AS [C2]
    FROM ( SELECT 
        [Extent1].[K1] AS [K1], 
        [dbo].[Concat]([Extent1].[A1]) AS [A1]
        FROM ( SELECT 
            [Extent1].[ProductCategoryID] AS [K1], 
            LEFT([Extent1].[Name], 4) AS [A1]
            FROM [Production].[ProductSubcategory] AS [Extent1]
        )  AS [Extent1]
        GROUP BY [K1]
    )  AS [GroupBy1]

Niladic function

Niladic functions are functions called without parentheses, e.g., these SQL-92 niladic functions:

  • CURRENT_TIMESTAMP
  • CURRENT_USER
  • SESSION_USER
  • USER

In C#:

public static class NiladicFunctions
{
    [Function(FunctionType.NiladicFunction, "CURRENT_TIMESTAMP")]
    public static DateTime? CurrentTimestamp() => Function.CallNotSupported<DateTime?>();

    [Function(FunctionType.NiladicFunction, "CURRENT_USER")]
    public static string CurrentUser() => Function.CallNotSupported<string>();

    [Function(FunctionType.NiladicFunction, "SESSION_USER")]
    public static string SessionUser() => Function.CallNotSupported<string>();

    [Function(FunctionType.NiladicFunction, "SYSTEM_USER")]
    public static string SystemUser() => Function.CallNotSupported<string>();

    [Function(FunctionType.NiladicFunction, "USER")]
    public static string User() => Function.CallNotSupported<string>();
}

When they are called:

[TestMethod]
public void NiladicFunctionInLinq()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        var firstCategory = database.ProductSubcategories
            .GroupBy(subcategory => subcategory.ProductCategoryID)
            .Select(category => new
            {
                CategoryId = category.Key,
                SubcategoryNames = category.Select(subcategory => subcategory.Name.Left(4)).Concat(),
                CurrentTimestamp = NiladicFunctions.CurrentTimestamp(),
                CurrentUser = NiladicFunctions.CurrentUser(),
                SessionUser = NiladicFunctions.SessionUser(),
                SystemUser = NiladicFunctions.SystemUser(),
                User = NiladicFunctions.User()
            })
            .First();
        Assert.IsNotNull(firstCategory);
        Assert.IsNotNull(firstCategory.CurrentTimestamp);
        Assert.IsTrue(DateTime.Now >= firstCategory.CurrentTimestamp);
        Assert.AreEqual("dbo", firstCategory.CurrentUser, true, CultureInfo.InvariantCulture);
        Assert.AreEqual("dbo", firstCategory.SessionUser, true, CultureInfo.InvariantCulture);
        Assert.AreEqual($@"{Environment.UserDomainName}\{Environment.UserName}", firstCategory.SystemUser, true, CultureInfo.InvariantCulture);
        Assert.AreEqual("dbo", firstCategory.User, true, CultureInfo.InvariantCulture);
    }
}

They are translated to SQL calls without parentheses:

SELECT 
    [Limit1].[C2] AS [C1], 
    [Limit1].[ProductCategoryID] AS [ProductCategoryID], 
    [Limit1].[C1] AS [C2], 
    [Limit1].[C3] AS [C3], 
    [Limit1].[C4] AS [C4], 
    [Limit1].[C5] AS [C5], 
    [Limit1].[C6] AS [C6], 
    [Limit1].[C7] AS [C7]
    FROM ( SELECT TOP (1) 
        [GroupBy1].[A1] AS [C1], 
        [GroupBy1].[K1] AS [ProductCategoryID], 
        1 AS [C2], 
        CURRENT_TIMESTAMP AS [C3], 
        CURRENT_USER AS [C4], 
        SESSION_USER AS [C5], 
        SYSTEM_USER AS [C6], 
        USER AS [C7]
        FROM ( SELECT 
            [Extent1].[K1] AS [K1], 
            [dbo].[Concat]([Extent1].[A1]) AS [A1]
            FROM ( SELECT 
                [Extent1].[ProductCategoryID] AS [K1], 
                LEFT([Extent1].[Name], 4) AS [A1]
                FROM [Production].[ProductSubcategory] AS [Extent1]
            )  AS [Extent1]
            GROUP BY [K1]
        )  AS [GroupBy1]
    )  AS [Limit1]

Model defined function

The following code defines a FormatName function for the Person model:

public static class ModelDefinedFunctions
{
    [ModelDefinedFunction(nameof(FormatName), "EntityFramework.Functions.Tests.Examples",
        @"(CASE 
            WHEN [Person].[Title] IS NOT NULL
            THEN [Person].[Title] + N' ' 
            ELSE N'' 
        END) + [Person].[FirstName] + N' ' + [Person].[LastName]")]
    public static string FormatName(this Person person) =>
        $"{(person.Title == null ? string.Empty : person.Title + " ")}{person.FirstName} {person.LastName}";

    [ModelDefinedFunction(nameof(ParseDecimal), "EntityFramework.Functions.Tests.Examples", "cast([Person].[BusinessEntityID] as Decimal(20,8))")]
    public static decimal ParseDecimal(this Person person) => Convert.ToDecimal(person.BusinessEntityID);
}

When FormatName is called in LINQ to Entities query:

[TestMethod]
public void ModelDefinedFunctionInLinqTest()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        var employees = from employee in database.Persons
                        where employee.Title != null
                        let formatted = employee.FormatName()
                        select new
                        {
                            formatted,
                            employee
                        };
        var employeeData = employees.Take(1).ToList().FirstOrDefault();
        Assert.IsNotNull(employeeData);
        Assert.IsNotNull(employeeData.formatted);
        Assert.AreEqual(employeeData.employee.FormatName(), employeeData.formatted);
    }

    using (AdventureWorks database = new AdventureWorks())
    {
        var employees = from employee in database.Persons
                        where employee.Title != null
                        select new
                        {
                            Decimal = employee.ParseDecimal(),
                            Int32 = employee.BusinessEntityID
                        };
        var employeeData = employees.Take(1).ToList().FirstOrDefault();
        Assert.IsNotNull(employeeData);
        Assert.AreEqual(employeeData.Decimal, Convert.ToInt32(employeeData.Int32));
    }
}

The queries are translated to:

SELECT 
    [Limit1].[BusinessEntityID] AS [BusinessEntityID], 
    [Limit1].[C1] AS [C1], 
    [Limit1].[Title] AS [Title], 
    [Limit1].[FirstName] AS [FirstName], 
    [Limit1].[LastName] AS [LastName]
    FROM ( SELECT TOP (1) 
        [Extent1].[BusinessEntityID] AS [BusinessEntityID], 
        [Extent1].[Title] AS [Title], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        CASE WHEN ([Extent1].[Title] IS NOT NULL) THEN [Extent1].[Title] + N' ' ELSE N'' END + [Extent1].[FirstName] + N' ' + [Extent1].[LastName] AS [C1]
        FROM [Person].[Person] AS [Extent1]
        WHERE [Extent1].[Title] IS NOT NULL
    )  AS [Limit1]

SELECT 
    [Limit1].[BusinessEntityID] AS [BusinessEntityID], 
    [Limit1].[C1] AS [C1]
    FROM ( SELECT TOP (1) 
        [Extent1].[BusinessEntityID] AS [BusinessEntityID], 
         CAST( [Extent1].[BusinessEntityID] AS decimal(20,8)) AS [C1]
        FROM [Person].[Person] AS [Extent1]
        WHERE [Extent1].[Title] IS NOT NULL
    )  AS [Limit1]

Version history

This library adopts the http://semver.org standard for semantic versioning.

  • 1.0.0: Initial release.
  • 1.0.1: Bug fix.
  • 1.1.0: Bug fix, and shortcut APIs for each function type:
    • [StoredProcedure]
    • [TableValuedFunction]
    • [ComposableScalarValuedFunction]
    • [NonComposableScalarValuedFunction]
    • [AggregateFunction]
    • [BuiltInFunction]
    • [NiladicFunction]
  • 1.2.0: Support model defined function with [ModelDefinedFunction].
  • 1.3.0: Support entity type and complex type defined in different assembly/namespace. Support table-valued function returning entity type or complex type.
  • 1.3.1: Fix a regression causing complex type not working properly with PostgreSQL.
  • 1.4.0: Sign assembly with strong named key. Fix minor issues.
  • 1.5.0: Support .NET Standard.

486 Comments

  • Hi there,
    Thanks in advance for this....this has been a feature that should be native to EF, so it will provide great utility for the masses!
    However, I'm having trouble getting things to compile...
    Your FunctionAttribute constructor doesn't seem to match your examples:
    [AttributeUsage(AttributeTargets.Method)]
    public class FunctionAttribute : DbFunctionAttribute
    {
    public FunctionAttribute(string name, FunctionType functionType);
    //example is : [Function(FunctionType.NonComposableScalarValuedFunction, nameof(ufnGetProductStandardCost), Schema = dbo)] //params are switched, and there is no schema param.... am I missing something or did you release an old set of code?

    public bool IsAggregate { get; }
    public bool IsBuiltIn { get; }
    public bool IsComposable { get; }
    public bool IsNiladic { get; }
    public ParameterTypeSemantics ParameterTypeSemantics { get; set; }
    public string Schema { get; set; }
    public FunctionType Type { get; }
    }

  • Thanks for your feedback. The document/nuget package was updated today, but the nuget package showed up much later. Now they are in sync. Please try to install the latest nuget (1.0.1), it should work.

  • That's one I needed for a long time!! Cool, thank you!!

  • Hi Dixin,
    I just want to stop back by and thank you for this library. It has helped me take a mess of a legacy database stored procs at a new job and turn it into a usable EF based set of C# classes. I was unable to get built-in functions working by doing extension methods.
    I was however able to use them in the same manner as any other normal function mapping. i.e.

    [Function(FunctionType.BuiltInFunction, "UPPER")]
    [return: Parameter(DbType = "varchar")]
    public string UPPER([Parameter(DbType = "varchar")]string Expression)
    {
    ObjectParameter ExpressionParameter = new ObjectParameter(nameof(Expression), Expression);
    return this.ObjectContext().ExecuteFunction<string>(nameof(this.UPPER), ExpressionParameter).SingleOrDefault();
    }
    The nice part is that once they are added to your DBContext, you can use them from linqpad in order to make sure everything is working properly before putting it into an application. The trickiest part was getting the SQL to CLR types to map...which makes this page and the chart extremely handy: https://msdn.microsoft.com/en-us/library/Bb386947%28v=vs.100%29.aspx

  • Wow... what a great post! Thanks for the info, super helpful. If you ever need to merge some documents, here is www.altomerge.com a really useful tool. Very easy to navigate and use.

  • Hi Dixin,

    I'm having a little trouble getting this up and runnning. I've added the function convention as:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Conventions.Add(new FunctionConvention<MyEntities>());
    }

    but now all calls to my database context fail with the error "The namespaceName parameter must be set for Table Valued Functions," even when I am not calling a TVF

    For example:

    public void GetCategories()
    {
    var db = new MyCategories();
    var categories = db.Categories; // this call fails
    }

    Where Categories is defined as

    public partial class MyEntities : DbContext
    {
    public DbSet<Category> Categories { get; set; }
    }

    Am I missing something important here?

  • Hi Dixin,

    I'm having a little trouble getting this up and runnning. I've added the function convention as:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Conventions.Add(new FunctionConvention<MyEntities>());
    }

    but now all calls to my database context fail with the error "The namespaceName parameter must be set for Table Valued Functions," even when I am not calling a TVF

    For example:

    public void GetCategories()
    {
    var db = new MyCategories();
    var categories = db.Categories; // this call fails
    }

    Where Categories is defined as

    public partial class MyEntities : DbContext
    {
    public DbSet<Category> Categories { get; set; }
    }

    Am I missing something important here?

  • Yes I think you may miss something :)

    The exception is thrown from https://github.com/Dixin/EntityFramework.Functions/blob/master/EntityFramework.Functions/FunctionAttribute.cs, line 52. It seems you have defined a table-valued function in MyEntities. EF requires a namespace name for table-valued function. So you have to specify it:
    [Function(FunctionType.TableValuedFunction, "functionName", "namespaceName", Schema = "dbo")]
    Or:
    [TableValuedFunction("functionName", "namespaceName", Schema = "dbo")]

    Thanks.

  • Thanks for the quick reply. Is that to say that this error is thrown if there are any TVFs defined that haven't been namespaced? The line I showed you in my example is the first point that my application accesses MyEntities.

  • Hi Dixin,

    First of all thanks for putting this help out there to support the code first approach.

    I am trying to use this module for my code first approach, but I am stuck at a point and hope you can provide some pointers to fix this. I have some storedprocedures which use large varchar2 and number out parameters in it. This is causing me issues for e.g. default varchar2 size is 4000, so when I have scenarios when the stored procedure returns more than that I get buffer size error.

    To resolve this I looked at the code, but could not find a way to update the facetdescriptions for the function parameters. They are readonly :(. As a workaround I am using odp.net calls to the call these stored procedures for the time being. It would be nice if you could point me in the right direction to use an additional parameter in the ParameterAttribute and be able to set MaxLength for stored procedure parameters.

    Thanks,
    Sukesh

  • Hi there, Thanks in advance and congrats on the lib, very nice.
    I'm trying to use your lib with EF 6 + MySQL, here is what a have done,
    First:
    CREATE FUNCTION TESTEFUNCAO(dateValue DATETIME, intervalo INTEGER) RETURNS date
    return date_add(dateValue, interval intervalo month);
    Second:
    [EntityFramework.Functions.Function(EntityFramework.Functions.FunctionType.BuiltInFunction, "TESTEFUNCAO")]
    public static DateTime? TESTEFUNCAO(this DateTime? dateValue, int intervalo) {
    throw new NotSupportedException("Chamar somente de um LINQ");
    }
    Finally:
    var dta = DateTime.Now;
    var lista = new myContext().EntityTest.Where(x => x.date_field.TESTEFUNCAO(2) >= dta).ToList();
    foreach (var item in lista) {
    Console.WriteLine(item.date_field);
    }

    I'm getting the exception:
    The specified method 'System.Nullable`1[System.DateTime] TESTEFUNCAO(System.Nullable`1[System.DateTime], Int32)' on the type 'Helpers.BuiltInFunctions' cannot be translated into a LINQ to Entities store expression.

    Can you give me a hint about the problem? Is that something todo with MySQL?
    Thank you again.

  • Hi Dixin,
    Thanks a lot for your work.
    I'm using table valued functions and with complex types everyting is fine. But whe I try entity types like Person in your example an error is thrown:
    Schema specified is not valid. Errors:$metadata(0,0) : error 0005: Concurrency mode invalid
    Thanks for any help

  • Hi

    I have a Stored Procedure returns a nullable long value. But I get an error like this:

    System.Nullable`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] for method AddRecord_SP is not supported in conceptual model as a structural type.

    The functions is declared in my DataContext class:

    [Function(FunctionType.StoredProcedure, "Sp_name", Schema = "acnt")]
    public virtual ObjectResult<Nullable<long>> AddRecord_SP(string i_Params)
    {
    var i_ParamsParameter = i_Params != null ?
    new ObjectParameter("I_Params", i_Params) :
    new ObjectParameter("I_Params", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<long>>("Sp_name", i_ParamsParameter);
    }

  • I have the same issue:

    System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] for method {methodName} is not supported in conceptual model as a structural type.

  • Is it possible to provide methods that use DBContext and not ObjectContext?

  • Please help me for BuildIn Functions:
    Cast , Convert

  • Hi I am using Oracle 12c Unmanged Driver for DotNet
    Seems to have a problem with functions that are not in the same Schema

    Oracle Built in function name that i want to map is: UTL_MATCH.EDIT_DISTANCE

    Function Definition is:
    [BuiltInFunction("EDIT_DISTANCE",Schema= "UTL_MATCH")]
    public static int EditDistance(string value1, string value2) => Function.CallNotSupported<int>();

    Generated SQL:

    SELECT
    "Limit1"."C1" AS "C1"
    FROM ( SELECT
    EDIT_DISTANCE('shackleford', 'shackelford') AS "C1"

    The Schema is not used when calling the function, and it thus fail.
    It Should be " UTL_MATCH.EDIT_DISTANCE('shackleford', 'shackelford')" but instead it calls just "EDIT_DISTANCE('shackleford', 'shackelford')"

    Any help will be greatly appreciated.
    Thanks!

  • Great library, Dixin!

    There is an issue with EF whereby it cant translate Guid[].Max(), ie

    from item in items
    group new { item.GuidProperty1, item.GuidProperty2 } by item.Id into g
    select new { id = g.Key, maxGuidValue1 = g.Max(a => a.GuidProperty1), maxGuidValue2 = g.Max(a => a.GuidProperty2) }

    Is there a way to create an aggregate function using EntityFramework.Functions and register it against the SQL server built-in Max aggregate function, to overcome this EF shortcoming?

    Thank you

  • Boolean built-in functions (like CONTAINS or FREETEXT) are translated into invalid SQL:

    SELECT *
    FROM Content
    WHERE (CONTAINS(Title, N'abc')) = 1

  • Hi, Thanks for the good work.
    I am trying to implement your feature.
    I am struggling with the docs... I am not sure if what I am asking is possible.
    Can I use UDF with EF without mapping it to result entity?
    I am trying to use a function query after wrapping it

    [Function(FunctionType.TableValuedFunction, nameof(GetChildsByUserName), "Forex.Contracts.CheetahCrm", Schema = "dbo")]
    public virtual IQueryable<GetChildIds_Result> GetChildsByUserName([Parameter(DbType = "varchar", Name = "userName")]string userName)
    {
    if (string.IsNullOrEmpty(userName))
    {
    throw new ArgumentNullException(nameof(userName));
    }
    var userNameParameter = new ObjectParameter("userName", userName);

    return (this as IObjectContextAdapter).ObjectContext
    .CreateQuery<GetChildIds_Result>(
    $"[{nameof(this.GetChildsByUserName)}](@{nameof(userName)})", userNameParameter);
    //"[Context].[GetChildsByUserName](@userName)", userNameParameter);
    }
    [ComplexType]
    public class GetChildIds_Result
    {
    public int Id { get; set; }
    }

    Is it possible ?
    If yes- how is it possible ?

  • Hi Dixin,

    Thank you for this extremely helpful and well written blog.

    I was trying to call a stored procedure spDescriptiveStatistics as shown below. I have to invoke the stored procedure from within the select statement. As shown below:
    new StudentQuartiles() { Median = from sg in myStudentGroup select dbContext.spDescriptiveStatistics(sg.MarksObtained, 0).Single).Median }
    I’m getting a compliation error saying “Cannot implicitly convert type system.IEnumerable<float> to float”

    The SP returns me a single row containing details of Min, Median, Max, Q1,Q3, Average.

    Below are my queries:
    1. I would like to obtain the values for the Median, Min etc from within the select statement so that I can avoid performance issues.
    2. However I do not wish to perform the implementation as shown below since it will add a performance overhead.
    ObjectResult<StudentQuartiles> quartiles = dbcontext.spDescriptiveStatisticsOne(marksList, 0);

    public class MyTestClass
    {

    public void MyTestMethod()
    {
    using (MyDbContext database = new MyDbContext())
    {
    select new TestGroup1()
    {
    TestKey = newGroup.Key,
    ByOption =
    from student in StudentGroup
    group new StudentSubGroup() { FName = student.FirstName, LName = student.LastName, MarksObtained = student.Marks}
    by new StudentGroupBy() { JoiningDate = student.JoiningDate }
    into myStudentGroup

    select new StudentQuartiles() { Median = from sg in myStudentGroup select dbContext.spDescriptiveStatistics(sg.MarksObtained, 0).Single).Median }

    };
    }
    }
    }

    public class MyDbContext
    {

    [ComplexType]
    public class StudentQuartiles
    {
    public Single Min { get; set; }
    public Single Max { get; set; }
    public Single Median { get; set; }
    public Single Average { get; set; }
    public Single FirstQuartile { get; set; }
    public Single ThirdQuartile { get; set; }
    }

    public const string dbo = nameof(dbo);
    [Function(FunctionType.StoredProcedure, nameof(spDescriptiveStatisticsOne), Schema = dbo)]
    public ObjectResult<Quartiles> spDescriptiveStatisticsOne(List<int> @marks, int @QuartileMethodType)
    {

    ObjectParameter inputParameter1 = new ObjectParameter(nameof(@marks), marks);
    ObjectParameter inputParameter2 = new ObjectParameter(nameof(@QuartileMethodType), @QuartileMethodType);
    return this.ObjectContext().ExecuteFunction<Quartiles>(
    nameof(this.spDescriptiveStatistics), inputParameter1, inputParameter2);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

    modelBuilder.Conventions.Add(new FunctionConvention<MyDbContext>());
    modelBuilder.ComplexType<StudentQuartiles>();
    }

    }

    Thanks,
    Shweta

  • After adding aggregate clr function Add-Migration fails:

    System.Data.Entity.Core.MetadataException: Schema specified is not valid. Errors:
    (0,0) : error 0034: Unknown namespace or alias (collection[SqlServer).

  • I have run into the same issue as Alexander Kovtik. Trying to use Oracle's REGEXP_LIKE function and it is generating invalid SQL.

    It generates a query like so
    SELECT *
    FROM table
    WHERE REGEXP_LIKE(field, 'expression string') = 1

    when it should generate a query like
    SELECT *
    FROM table
    WHERE REGEXP_LIKE(field, 'expression string')

    I have defined the function like so
    [Function(FunctionType.BuiltInFunction, "REGEXP_LIKE")]
    public static bool REGEXP_LIKE(string columnValue, string regularExpression)
    {
    return Function.CallNotSupported<bool>();
    }

    This library is awesome, and supporting these types of functions will make it even better.

  • I have a Split table-valued function, which takes a string and a delimiter and returns the split values.

    SELECT * FROM Split('a|b|c', '|')
    returns
    a
    b
    c

    IF EXISTS (SELECT * FROM sys.all_objects WHERE name = 'Split' AND Type = 'TF')
    DROP FUNCTION dbo.Split
    GO
    CREATE FUNCTION dbo.Split
    (
    @String varchar(MAX)
    ,@Delimiter char(1)
    )
    RETURNS @TempTable TABLE (Value varchar(MAX))
    AS
    BEGIN
    DECLARE @Idx int
    DECLARE @Slice varchar(8000)

    SELECT @Idx = 1

    IF len(@String) < 1 OR @String IS NULL
    RETURN

    WHILE @Idx != 0
    BEGIN
    SET @Idx = charindex(@Delimiter, @String)

    IF @Idx != 0
    SET @Slice = left(@String, @Idx - 1)
    ELSE
    SET @Slice = @String

    if (len(@slice) > 0)
    INSERT INTO @TempTable (Value) VALUES (@Slice)

    SET @String = right(@String, len(@String) - @Idx)

    IF len(@String) = 0
    BREAK
    END
    RETURN
    END
    GO

    I made the following:

    [ComplexType]
    public class ValueVarChar
    {
    public string Value { get; set; }
    }

    And I'm trying to set up the function with:

    [Function(FunctionType.TableValuedFunction, "Split", "DataModel", Schema = "dbo")]
    public IQueryable<ValueVarChar> Split([Parameter(DbType = "varchar", Name = "String" )]string str,
    [Parameter(DbType = "char", Name = "Delimiter")]char delimiter)
    {
    return this.ObjectContext().CreateQuery<ValueVarChar>("dbo.Split(@String, @Delimiter)",
    new ObjectParameter("String", str),
    new ObjectParameter("Delimiter", delimiter));
    }

    But, I'm getting the following error:

    Type FullName in method Split is not supported in conceptual model.

  • Hi Dixin, this very usefull package.
    Nevertheless i can not still figure out some situation.
    For instance with CAST:

    I have written functin

    [ModelDefinedFunction(nameof(StringToInt), "NewJdsProvider.Context", @"Cast(str1 as int)")]
    public static int? StringToInt(this string str1)
    {
    int result = 0;
    return int.TryParse(str1, out result) ? result : (int?)null;
    }

    which gives me error:System.String for method StringToInt is not supported in conceptual model as a structural type. This can be caused by a failure to register this type as complex. For more information, see https://msdn.microsoft.com/en-us/library/gg679474.aspx

    Which means that ModelDefinedFunction can be used only with ComplexType. However why it should?

    To use CAST as builtin function also not clear,. What should be used for second parameter (as a type)? Do you have full documentation for your package?
    Eager to hear from you,
    Thank you in advance.


  • Hi Dixin,

    Your blog is really very helpful.

    Coming to Multiple Result sets returning from stored procedure,
    I am having an entity with enum property which is Integer column in Database.
    If i try to return this entity values from database by using ResultType annotation,
    On screen logging in itself am getting below exception.

    MyEntityName for method MyMethodName is not supported in conceptual model as a structural type.

    Could you tell me why it is happening?

  • Hi Dixin, thanks for your blog. It's really helpful. I successfully tested it on MS SQL database.
    I want to ask if this library is suitable for PostgreSQL database too?

    Regards
    Richard

  • Add-Migration stop working after set "modelBuilder.AddFunctions<DbContext>();"

  • Hi Dixin,
    Thanks - this has been a lifesaver. I'm trying to convert a legacy edmx solution to code first - we ran into a limit on the number of tables in the edmx.
    I'm running into the same problem as a couple of the other posters:
    System.Nullable`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] for method AddRecord_SP is not supported in conceptual model as a structural type.

    I'm using the method that was generated from the EDMX and have added the StoedProcedure attribute:
    [StoredProcedure(nameof(IdentifierInvoiceGet), Schema = "dbo")]
    public virtual ObjectResult<long> IdentifierInvoiceGet()
    {
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<long>("IdentifierInvoiceGet");
    }

    Is there a solution?

  • For anyone looking for a solution/workaround to the "not supported in conceptual model as a structural type." problem...
    I was able to change my calls to use ExecuteStoreQuery instead of ExecuteFunction.
    This StackOverflow question has a tt that will generate ExecuteStoreQuery statements from an EDMX:
    https://stackoverflow.com/questions/8462161/entity-framework-ef4-1-stored-procedure-could-not-be-found-in-the-container

    So, the original version:
    public virtual ObjectResult<long> IdentifierInvoiceGet()
    {
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<long>("IdentifierInvoiceGet");
    }

    Converts to:
    public virtual ObjectResult<Nullable<long>> IdentifierInvoiceGet()
    {
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<Nullable<long>>("IdentifierInvoiceGet");
    }

    Or a method with parameters:
    public virtual ObjectResult<Nullable<long>> LookupVisualIndicatorsUpdate(string config)
    {
    var configParameter = config != null ?
    new SqlParameter("config", config) :
    new SqlParameter("config", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<Nullable<long>>("LookupVisualIndicatorsUpdate @config", configParameter);
    }

  • Hi Dixin, thanks a lot for this page. A question: Sql server 2005 is supported from this Library?

  • Same problem as Bruno Melo, Add-Migration is broken after modelBuilder.AddFunctions<DbContext>(); Any fix or workaround ?
    Altogether great package ! Shame that it is not supported natively by EF.

  • Hi Dixin,

    Very appreciated job and thanks for sharing it.
    One question:
    Do you think is possible to AddFunction to the model without having to use the DbFunction Entity Framework attribute.
    I try to explain better...
    The Function attribute you defined is inherited from EF DbFunction attribute. I tried to abstract it defining a Function attribute inherited from generic Attribute (adding the missing namespacename and functionname properties). I changed a little bit your code and extension methods according to the new defined Function attribute. Of course it doesn't work :-) even if the Functions are correctly defined into the storage model so... again the question:
    Is it possible to avoid the usage of the EF DbFunction attribute?

    Thanks in advance
    Luigi

  • thank you, now my problem is finished after reading your article, thank you

  • Thank you, I really like it, the article is very helpful

  • I tried to make a method for retrieving 3 complex types via a stored procedure. It seems that only entities and not complex types (as allowed in TVF's) could be used when calling a stored procedure.
    Can you help?

    Example code:

    namespace Data
    {
    using EntityFramework.Functions;
    using System;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Data.Entity.Core.Objects;
    using System.Data.Entity.SqlServer;

    public class DataContext : DbContext
    {
    public const string dbo = nameof(dbo);
    public const string GetReportData = nameof(GetReportData);

    public DataContext() : this(nameof(DataContext))
    {
    }

    protected override void OnModelCreating(DbModelBuilder mb)
    {
    base.OnModelCreating(mb);

    mb.Conventions.Add(new FunctionConvention<DataContext>());

    mb.ComplexType<ComplexType1>();
    mb.ComplexType<ComplexType2>();
    mb.ComplexType<ComplexType3>();

    mb.AddFunctions<DataContext>();
    }

    [Function(FunctionType.StoredProcedure, GetReportData, Schema = dbo)]
    [ResultType(typeof(ComplexType1))]
    [ResultType(typeof(ComplexType2))]
    [ResultType(typeof(ComplexType3))]
    public virtual ObjectResult<ComplexType1> DebtorReportData(int Id, DateTime StartDate, DateTime EndDate)
    {
    ObjectParameter IdParameter = new ObjectParameter(nameof(Id), Id);
    ObjectParameter StartDateParameter = new ObjectParameter(nameof(StartDate), StartDate);
    ObjectParameter EndDateParameter = new ObjectParameter(nameof(EndDate), EndDate);

    return this.ObjectContext().ExecuteFunction<ComplexType1>(
    GetReportData, IdParameter, StartDateParameter, EndDateParameter);
    }
    }

    [ComplexType]
    public class ComplexType1
    {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Value { get; set; }
    }

    [ComplexType]
    public class ComplexType2
    {
    public int Id { get; set; }
    public string StringProperty { get; set; }
    }

    [ComplexType]
    public class ComplexType3
    {
    public int Id { get; set; }
    public DateTime DateProperty { get; set; }
    }
    }

  • Hi, many thanks for your tutorial,
    i have a error: Schema specified is not valid.

  • I greatly appreciate your kind word.

  • do you realize that the code samples are 1/2 in c# and 1/2 in html?

  • I can't seem to be able to retrieve a string output parameter from a stored procedure, you example shows only one integer output param ..how about execute stored proc (i int, s, string output) ? please show me how to do this,
    Thanks

  • Hello,

    Thank you for this library. it saved me time and help to keep a clean code design.
    I really like how easy to use it has been design compare to the difficulty (hell ?) it looks to create is own generic proper EDM function/sp mapper.
    By reading your code, I understand more how EF is working with theses models.

    Thank you!

  • Very Effective Tips. Thanks for sharing

  • This website has been created to cater for the need of the teeming population of those people

  • Many thanks for your assistance in our project.

  • Before I tried out SizeGenetics, I made use of various male enhancement pills. Those pills helped me in getting better erections which I was satisfied with at the time. Then as time went by, I wanted more. I wanted to grow the size of my penis on a permanent basis and not a worn off thing.It was in the process of searching for something that works that I read about penis extenders. I read extensively on penis extenders and realized that they were indeed the surest way of increasing the size of the penis permanently.

  • search for 123FormBuilder promotion code or coupon on its website.However, you are able to harder to get discount packages or discount codes which suit your needs.Thus, check out 123FormBuilder Promotion Code in which we usually up-date the newest offers and discount activities. With only several mouse clicks, it's easy to pick your preferred items from 123FormBuilder and save money for you.

  • im fine thanks

  • thats good dear

  • hello I have this stored procedure but I can't get it to return the return value

    ALTER PROCEDURE [dbo].[document]
    (
    @Cn VARCHAR(3),
    @CE SMALLINT,
    @Ej SMALLINT,
    @CC VARCHAR(15),
    @CC VARCHAR(10),
    @Se VARCHAR(10),
    @Sv BIT,
    @Sd SMALLINT,
    @Ctor INT OUTPUT
    )

  • Excellent items from you, man.

  • it new like

  • Bathmate has been recommended for all men to be used routinely as a sexual health activity. The Bathmate Pump has been created and developed for user convenience and safety. Therefore millions of men have benefited from the overall hydrotherapy system of Bathmate.

  • Hi, thanks for your help I did and my problem was resolved.

  • Normally I don’t read post on blogs, but I would like to say that this write-up very forced me to check out and do it! Your writing taste has been amazed me. Thanks, quite nice article. <a href="https://www.totosite365.info" target="_blank" title="스포츠토토">스포츠토토</a>


  • I love your blog.. very nice colors & theme. Did you make this website yourself or did you hire someone to do it for you? Plz reply as I’m looking to create my own blog and would like to find out where u got this from. thanks <a href="https://www.slotmachine777.site" target="_blank" title="슬롯머신">슬롯머신</a>

  • Incase you are looking for something interesting, Just follow the link :<a href="https://www.badugisite.net" target="_blank" title="바둑이게임">바둑이게임</a> We have so many to offer!!

  • I simply wish to give an enormous thumbs up for the great information you will have here on this post. looking for good and trusted sports betting site?click the link here <a href="https://www.racesite.info/" target="_blank" title="경마">경마</a>

  • you have done a great job. I will definitely dig it and personally recommend to my friends. I am confident they will be benefited from this site. <a href="https://www.powerball365.info" target="_blank" title="파워볼">파워볼</a>

  • After reading through this article it really helped me, thank you.

  • Wow this is nice page. Hoping to see more of this. In case you are looking for something interesting, Just follow the link below

  • Wow!! Thank you for sharing this post. Having a hard time looking for good and trusted site? I can offer you more and learn more by clicking the link below:

  • Your blog is great!!! Good content!! I would recommend this to my friends. But are you looking for online casino site? Click the link below:

  • our company sale heavy blocks
    we are a blocks production company

  • Wow this is nice page. good post

    tanks

  • Gashta Sanat Isfahan is a large platform to buy industrial machinery such as packaging machines, coding machines, sealing machines and so on.
    <a href="https://karopack.ir/induction-sealer-machine/">قیمت دستگاه سیل القایی </a>
    <a href="https://karopack.ir/%d8%af%d8%b3%d8%aa%da%af%d8%a7%d9%87-%d8%af%d9%88%d8%ae%d8%aa/">خرید دستگاه دوخت ریلی</a>

  • I must say you have written a great article. The way you have described everything is phenomenal. If you have time, please visit my site <a href="https://www.totosite365.info/%ED%86%A0%ED%86%A0.html" target="_blank" title="토토">토토</a>

  • Daebak! that’s what I was looking for, what a information! present here at this website https://www.slotmachine777.site

  • This article presents clear idea designed for the new visitors of blogging, that in fact how to do blogging and site-building.

  • Article writing is also a fun, if you know then you can write otherwise it
    is complex to write.Look at my site

  • Thanks designed for sharing such a pleasant thinking, piece of writing is good, thats why i have read it entirely

  • We are providing Graphics Design Training in Dhaka, Graphic Design Training Institute, Best Graphic Design Training in Dhaka, Graphic Design Training Center

  • You can get Apple-certified repairs and service at the Apple Store or with one of our Apple Authorized Service Providers. You can also send your iPhone to an Apple Repair Center

  • We are provide : Dropped phone repair Erie,phone home buttons repair Erie,phone home buttons replace Erie

  • Thank you
    I love Programming
    I share it via my Git-hub

  • Aw, this was a really nice post! I would like to thank you for the efforts you’ve put in writing this site.

  • You can certainly see your expertise within the article you write.
    The sector hopes for more passionate writers such as you who aren’t afraid to say
    how they believe. Always follow your heart.

  • This Site is in fact excellent post I am Pleased to see . It’s actually a wonderful and useful little bit of guidance. Thanks for sharing this sort of post That’s fine.

  • Hello, thank you for the good information.
    I have good information. I want to take a look.
    <a href="https://crozetpizza.net">토토사이트</a>

  • Nice to meet you. I read the text well. I have good information.
    <a href="https://https://weareexitmusic.com/" target="_blank" title="먹튀검증">먹튀검증</a>

  • It's cold
    Take good care of your body. I have good information.
    <a href="https://imaginemegame.com" target="_blank" title="파워볼">파워볼</a>

  • Hi I read the article well
    I also have good information. Take a look
    <a href="https://euro-fc.com" target="_blank" title="안전놀이터">안전놀이터</a>

  • Nice to meet you. I read the text well. I have good information.
    <a href="https://https://weareexitmusic.com/" target="_blank" title="먹튀검증">먹튀검증</a>

  • It has been an article that has been described in the best way I have ever read. Thank you admin .

  • It’s a really great article I have seen today, After reading this article I can say that the voting procedure is very above our mind level they have very strong strategies.

  • I recently came across your blog and have been reading along. I thought I would leave my first comment. I don’t know what to say except that I have enjoyed reading. Nice blog. I will keep visiting.

  • This Site is in fact excellent post I am Pleased to see . It’s actually a wonderful and useful little bit of guidance.<a href="https://www.baccaratsite.top" target="_blank" title="바카라사이트탑">바카라사이트탑</a> Thanks for sharing this sort of post That’s fine.

  • We would like to thank you for this beautiful sharing, which has been a confident sharing, we wish you continued sharing.<a href="https://www.baccaratsite.top" target="_blank" title="온라인카지노">온라인카지노</a>

  • Perfectly written articles, Really enjoyed reading through. Please visit my web site

  • You made some good points .I did a little research on the topic and found that most people agree with your blog. Thanks.

  • I'm writing on this topic these days, <a href="https://mtygy.com/">먹튀검증</a>, but I have stopped writing because there is no reference material. Then I accidentally found your article. I can refer to a variety of materials, so I think the work I was preparing will work! Thank you for your efforts.

  • I must admire the way you've shared an in-depth review of the iPhone 7 with each detail having a screenshot to better provide insights on its specs. I'm a frequent Google user and just came across your blog as I'm an Apple Fan and keep searching everything about it. Just loved the way you've written every minute detail about it. Keep up the Good Work, Mate!

  • Your skill is great. I am so grateful that I am able to do a lot of work thanks to your technology.<a href="https://twiddeo.com/" target="_blank">토토사이트</a> I hope you keep improving this technology.

  • You have a very good site, well constructed and very interesting i have bookmarked you hopefully you keep posting new stuff.<a href="https://www.baccaratsite.top" target="_blank" title="카지노사이트">카지노사이트</a>

  • I’d like to thank you for the efforts you have put in penning this blog. I’m hoping to view the same high-grade blog posts from you later on as well.

  • Thanks for this vital information through your website. I would like to thank you for the efforts you had made for writing this awesome article.

  • I'm writing on this topic these days, <a href="https://mtygy.com/">먹튀검증</a>, but I have stopped writing because there is no reference material. Then I accidentally found your article. I can refer to a variety of materials, so I think the work I was preparing will work! Thank you for your efforts.

  • Making the web with the website audience. And with this part, it is easy to use for both phones and mobile phones. And very important to the website.

  • I don't know how many hours I've been searching for articles of these answers. Glad to find your article.<a href="https://kipu.com.ua/">먹튀신고</a>

  • It's a great and informative site. You did a great job. continue!
    I will dig it up personally. If you are bored and want to relax, visit our site. I am sure you will enjoy it!
    <a href="https://crozetpizza.net">토토사이트조회</a>


  • Wow, great blog layout! How long have you been blogging?
    Made blogging easy.
    The content as well as the overall look of the site is great!
    <a href="https://weareexitmusic.com/">메이저놀이터</a>


  • Greetings! This is my first visit to your blog!
    We are a group of volunteers and starting a new initiative in a community in the same niche.
    Your blog provided us beneficial information to work on
    <a href="https://www.euro-fc.com">안전놀이터주소</a>

  • Thanks for sharing great information. Your website is very nice. The details on this blog are impressive
    What a great website! This website is It gives us useful data.
    <a href="https://www.imaginemegame.com//">실시간파워볼</a>

  • always a large fan of linking to bloggers that I like.

  • That's a great article! The neatly organized content is good to see. Can I quote a blog and write it on my blog? My blog has a variety of communities including these articles. Would you like to visit me later? <a href="https://glassjournalism.io/">우리카지노</a>

  • What’s ᥙp Deɑr, are you trսily visіting this ԝebsitе on a reguⅼar ƅasiѕ,
    if s᧐ after that yοu ᴡill ɑbsolutely get pleаsant experience.

    Feel ffreе to visіt my webpage …

  • This is one of my favourite website. Every time I enjoying a lot while read all the meaningful blogs of this website.

  • I like the data. I've been using this stuff lately.<a href="https://twiddeo.com/" target="_blank">먹튀검증</a>

  • I needed several examples to write an article on this subject, and your article was of great help to me.<a href="https://kipu.com.ua/">먹튀신고</a>

  • This is my first time i visit here.
    I found so many entertaining stuff in your blog, especially its discussion.
    From the tons of comments on your articles,
    I guess I am not the only one having all the leisure here! Keep up the good work.
    I have been meaning to write something like this on my website and you have given me an idea.
    <a href="https://crozetpizza.net">토토사이트</a>


  • This is my first time i visit here.
    I found so many entertaining stuff in your blog, especially its discussion.
    From the tons of comments on your articles,
    I guess I am not the only one having all the leisure here! Keep up the good work.
    I have been meaning to write something like this on my website and you have given me an idea.
    <a href="https://weareexitmusic.com/">먹튀검증</a>

  • Thanks for sharing great information. Your website is very nice. The details on this blog are impressive
    What a great website! This website is It gives us useful data.
    <a href="https://www.euro-fc.com//">안전놀이터</a>

  • It's a great and informative site. You did a great job. continue!
    I will dig it up personally. If you are bored and want to relax, visit our site. I am sure you will enjoy it!
    <a href="https://www.imaginemegame.com//">파워볼</a>

  • Hi, I do think this is a great site. I stumbledupon it 😉 I’m going to revisit once again since i have saved as a favorite it. Money and freedom is the best way to change, may you be rich and continue to help others.

  • Your article is very interesting for me to read and visit your site. thank you.

  • I know that you put much attention for these articles, as all of them make sense and are very useful.

  • Good article! I found some useful information in your blog, it was awesome to read, thanks for sharing this great content to my vision, keep sharing…

  • That is a really good tip particularly to those fresh to the blogosphere.
    Brief but very precise info… Thank you
    for sharing this one. A must read article!
    <a href="https://crozetpizza.net">토토사이트</a>

  • After looking through a few blog articles on your website,
    we sincerely appreciate the way you blogged.
    We've added it to our list of bookmarked web pages and will be checking back in the near
    future. Please also visit my website and tell us what you think.
    <a href="https://weareexitmusic.com/">먹튀검증</a>


  • Hey there, You have done a fantastic job.
    I will certainly digg it and personally suggest
    to my friends. I’m confident they’ll be benefited from this
    website.
    <a href="https://www.euro-fc.com">안전놀이터</a>


  • Hello, you did a great job.
    I definitely dig it
    I would personally suggest to my friends. I have them
    I am sure you will benefit from the website
    <a href="https://www.imaginemegame.com">파워볼</a>

  • Are you looking for custom packaging for your CBD boxes? Well, look no further Because Custom CBD Boxes is here for you. There are two major reasons as to why you should use a customized box for your CBD boxes; market size and CBD unique position in society.
    https://www.custompackagingboxes.co.uk/shop/custom-cbd-boxes/

  • Your article was very impressive to me. It was unexpected information,but after reading it like this <a href="https://glassjournalism.io">카지노사이트</a>, I found it very interesting.

  • Hello, thank you for the good information.
    I have good information. I want to take a look.
    <a href="https://crozetpizza.net">토토사이트</a>


  • Nice to meet you. I read the text well. I have good information.
    <a href="https://https://weareexitmusic.com/" target="_blank" title="먹튀검증">먹튀검증</a>

  • Hi I read the article well
    I also have good information. Take a look
    <a href="https://www.euro-fc.com" target="_blank" title="안전놀이터">안전놀이터</a>

  • It's cold
    Take good care of your body. I have good information.
    <a href="https://www.imaginemegame.com" target="_blank" title="파워볼">파워볼</a>

  • Thanks for producing those essential, dependable, explanatory and in addition unique guidance on your topic to Kate.<a href="https://www.racesite.info/" target="_blank" title="경마사이트인포">경마사이트인포</a>

  • Extremely happier for the guidance and as well , believe you know what a powerful job your are putting in teaching<a href="https://www.safetotosite.pro/" target="_blank" title="안전토토사이트">안전토토사이트</a>

  • This is a great inspiring article.I am pretty pleased with your good work

  • Thanks For Sharing Information, I really Like Your Blog. Its Really Helpful For me And Please Keep Posting..

  • I truly appreciate this post. I’ve been looking everywhere for this! Thank goodness I found it on Bing.

  • Thanks for sharing such great information. I also write about casino& sports betting online on my personal blog. kindly check out my page and learn more about online gambling! Thanks a lot admin!

  • Many casinos even have sportsbooks, bingo and poker rooms attached. Funds can easily be transferred from one tab to another, giving real-money players in the game even more choice. Online gambling sites offer superior entertainment to playing in a land-based casino.

  • Frequently comes to the wrong conclusions and assumes things.

  • Needs to develop analytical skills necessary to weigh options and choose the best way to deal with situations.

  • Often offers workable solutions to problems.

  • Displays initiative and enthusiasm during everyday work.

  • One thing I’d really like to reply to is that fat burning plan fast is possible by the suitable diet and exercise <a href="https://www.reelgame.site/" target="_blank" title="파친코">파친코사이트</a>. A person’s size not just affects appearance, but also the quality of life. Self-esteem, depressive disorders, health risks, as well as physical abilities are affected in weight gain. It is possible to do everything right but still gain. In such a circumstance, a problem may be the offender. While a lot of food instead of enough exercise are usually the culprit, common health conditions and traditionally used prescriptions can greatly increase size. I am grateful for your post here.

  • Hi! I was perusing your website and wanted to drop a note that I really liked it. I thought I’d share a site too. You can learn about past life regression there. Check it out if you’re interested. Thanks <a href="https://www.majortotosite.pro/" target="_blank" title="토토">토토</a>!!

  • Having read this I thought it was very enlightening. I appreciate you taking the time and energy to put this short article together. I once again find myself personally spending a lot of time both reading and posting comments. But so what, it was still worth it!

  • This is a good page to be honest

  • As soon as I noticed this internet site I went on reddit to share some of the love with them. <a href="https://remarka.kz/">안전놀이터</a>

  • What a nice post! I'm so happy to read this. <a href="https://mtygy.com/">토토커뮤니티</a> What you wrote was very helpful to me. Thank you. Actually, I run a site similar to you. If you have time, could you visit my site? Please leave your comments after reading what I wrote. If you do so, I will actively reflect your opinion. I think it will be a great help to run my site. Have a good day.

  • I am overwhelmed by your post with such a nice topic. Usually I visit your <a href="https://instarad.io/" target="_blank">안전놀이터</a> and get updated through the information you include but today’s blog would be the most appreciable. Well done!

  • I need you to thank for your season of this awesome <a href="https://twiddeo.com/" target="_blank">먹튀검증</a>!!! I definately appreciate each and every piece of it and I have you bookmarked to look at new stuff of your blog an absolute necessity read blog!!!!

  • Nice to meet you. Your post was really impressive. It's an unexpected idea. It was a great stimulus to me.How did you come up with this genius idea? Your writing ability is amazing. Like me, you may be interested in my writing. If you want to see my article, please come to <a href="https://mtboan.com/" target="_blank">토토커뮤니티</a>!!

  • Nice to be visiting your blog once more, it has been months for me. Well this article that ive been waited for therefore long. i want this article to finish my assignment within the faculty, and <a href="https://instarad.io/" target="_blank">안전놀이터</a> has same topic together with your article. Thanks, nice share.

  • I need you to thank for your season of this awesome <a href="https://twiddeo.com/" target="_blank">먹튀검증</a>!!! I definately appreciate each and every piece of it and I have you bookmarked to look at new stuff of your blog an absolute necessity read blog!!!!

  • Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web! <a href="https://www.baccaratsite.top" target="_blank" title="온라인카지노">온라인카지노</a>

  • ستاره زیبایی اولین و بزرگترین فروشگاه تخصصی آرایشی و بهداشتی <a href="http://www.beautystarshop.com/product-category/%d8%a2%d8%b1%d8%a7%db%8c%d8%b4%db%8c-%d9%85%d9%88/%d8%b4%d8%a7%d9%85%d9%be%d9%88-%d8%b1%d9%86%da%af-%d9%85%d9%88/">شامپو رنگ</a> درسال 1384 تاسیس گردید. در وهله اول اقدام به تولید ملزومات آرایشی و زیبایی و توزیع گسترده به صورت مستقیم به مصرف کنندگان نمود و پس از آن باتوجه به نیاز بازار سالن های زیبایی و آرایشگاهی سبد کالایی محصولات خود را گسترده نموده و به برترین برندهای محصولات آرایشی و زیبایی دستیابی نمود. این مجموعه با ارتقاء سطح کیفیت خدمات خود و با شعار کیفیت زیبایی و همراه با سلامتی و با به کارگرفتن به روزترین تجهیزات و نیروهای مجرب در راستای احترام به مصرف کنندگان و در همه حال با کیفیت ترین محصولات خود را با قیمت مناسب به بازار هدف ارائه نموده است و در همه حال به حقوق مصرف کنندگان احترام گذاشته است ...

  • عمران صنعت پایا با گردهم آوردن پرسنل ماهر و متعهد، فعالیت خود را در عرصه تولید انواع قالب های بتن، جک و داربست های مدولار و تجهیزات قالب بندی با پشتوانه بیش از ده سال فعالیت سازنده در عرصه عمران و تولید میهن پهناورمان آغاز نموده و پس از سال ها تلاش مستمر و چشمگیر با یک مجموعه صنعتی پیشرفته تولید روزانه خود را منطبق بر استانداردهای لازم و دارای ویژگی های منحصر بفرد کیفی و فنی به اقصی نقاط کشور و بزرگترین و حساس ترین پروژه های زیربنایی بطور مستقیم و یا از طریق نمایندگان و عاملین مجاز فروش عرضه می نماید ...

  • خدمات فنی مقصود فعالیت خود را از دو دهه قبل با 16 سال تجربه در زمینه خدمات لوله بازکنی ، تخلیه چاه و خدمات چاه و فاضلاب آغاز نمود که با توجه به نیاز روز افزون مشتریان، تاکنون توانسته با افتخار بیش از صدها پروژه موفق را بصورت شبانه روزی به انجام برساند و در خدمت تمامی همشهریان خود باشد. این مجموعه با داشتن نیروهایی با تجربه و متخصص در زمینه انواع خدمات لوله بازکنی و تخلیه چاه و با بهره گیری از بروز ترین ماشین آلات و دستگاه های …

  • Nice post. Highly recommendable. Are you looking for where to get past questions and answer, then kindly visit <a href="https://nairapastquestions.com/recruitment/">Naira past questions</a> which is an online hub that deals with past questions and answers for any external exams or job interview.

  • Gashta Sanat Isfahan is a large platform to buy industrial machinery such as packaging machines, coding machines, sealing machines and so on.

  • such a great post. thanks a lot. I really enjoy your post and data.

  • I am really impressed with your blog article, such great & useful information you mentioned here. I have read all your posts and all are very informative. Thanks for sharing and keep it up like this. <a href="https://www.majortotosite.pro/" target="_blank" title="토토">토토</a>

  • Magnificent beat ! I wish to apprentice while you amend your web site, how could i subscribe for a blog web site?
    The account aided me a acceptable deal. I had been a little bit acquainted
    of this your broadcast provided bright clear concept

  • You should take part in a contest for one of the highest quality sites on the web.
    I’m going to recommend this website!

  • Very good written information. It will be valuable to anybody who employess it, as well as yours truly :). Keep up the good work ? for sure i will check out more posts.

  • 저희 먹튀보스는 토토사이트 관련 최고의 전문가들로 구성되어 있으며, 전문가들의 복잡하고 다양한 먹튀 검증 절차에 합격한 안전한 토토사이트 안내드리고 있습니다. 뿐만 아니라 "사설 토토사이트 업계에 100% 안전은 없다" 는 생각에 혹시나 발생할 수 있는 사고의 가능성을 염두하여 선 보증금 제도를 통해 보증금을 예치한 안전한 보증업체를 소개해드리고 있습니다.

  • In the event of an unavoidable accident while using a guarantee company, we will compensate 100% of our products. Our Muck Boss is made up of the best experts related to Toto Site, and we guide you to the safe Toto Site that has passed the complicated and diverse process of verifying the Toto Site by experts.

  • Nice blog. Keep up the good work!
    <a href="https://www.casinosite777.info" target="_blank" title="온라인카지노">온라인카지노</a>

  • Excellent Blog! I would like to thank for the efforts you have made in writing this post.
    <a href="https://www.baccaratsite.top" target="_blank" title="온라인카지노">온라인카지노</a>

  • Nice article I agree with this.Your blog really nice. Its sound really good
    <a href="https://www.sportstoto.zone" target="_blank" title="스포츠토토">스포츠토토</a>

  • This is really helpful post and very informative there is no doubt about it. it’s awesome dude I found this one pretty fascinating and it should go into my collection.
    <a href="https://www.baccaratsite.biz" target="_blank" title="온라인카지노">온라인카지노</a>

  • Every weekend i used to pay a quick visit this web site, because i want enjoyment, for the reason that this this
    web page conations really nice funny data too.<a href="https://jusoyo1.5to.me" rel="nofollow">링크사이트</a><br>

  • Attractive section of content. I simply stumbled upon your blog and in accession capital to assert that I acquire in fact enjoyed
    account your blog posts. Anyway I’ll be subscribing
    on your augment or even I success you access constantly quickly.<a href="https://haebam.com" rel="nofollow">선물거래</a><br>

  • When did you start writing articles related to ? To write a post by reinterpreting the <a href="https://mtygy.com/">안전놀이터</a> I used to know is amazing. I want to talk more closely about , can you give me a message?

  • <a href="https://bespokepackaginguk.co.uk/">bespoke packaging boxes uk</a> At Bespoke Packaging UK we strongly believe in the interests of bespoke packaging, which has multiple benefits.

  • I need you to thank for your season of this awesome <a href="https://twiddeo.com/">먹튀검증</a>!!! I definately appreciate each and every piece of it and I have you bookmarked to look at new stuff of your blog an absolute necessity read blog!!!!

  • Yes i am totally agreed with this article and i just want say that this article is very nice and very informative article.I will make sure to be reading your blog more. You made a good point but I can't help but wonder for <a href="https://instarad.io/">안전놀이터</a>, what about the other side? !!!!!!Thanks

  • Thank you for any other informative blog. Where else may just I am getting that kind of information written in such a perfect method? I have a mission that I’m simply now working on, and I have been on the glance out for such info. https://kipu.com.ua/ 먹튀검증

  • Well I definitely enjoyed studying it. This information provided by you is very practical for good planning.

  • I am regular visitor, how are you everybody? This paragraph posted
    at this website is genuinely fastidious.

  • Unbelievable!! The problem I was thinking about was solved.<a href="https://glassjournalism.io"/>카지노사이트</a>You are really awesome.

  • It's really helpful
    thanks for sharing

  • I don’t know whether it’s just me or if perhaps everyone else experiencing problems with your blog.
    It looks like some of the text within your posts are running off the screen. Can someone else please provide feedback and let me know if this is happening to them as well?
    This may be a issue with my browser because I’ve had
    this happen previously. Cheers

  • Great writing to see, glad that google brought me here, Keep Up cool job!

  • It's very interesting. And it's fun. This is a timeless article. I also write articles related to , and I run a community related to <a href="https://mtygy.com/">안전놀이터</a>. For more information, please feel free to visit !!

  • That's so nice.<a href="https://twiddeo.com/" target="_blank">먹튀검증</a>I want you to see if it's this good.

  • I need you to thank for your season of this awesome <a href="https://twiddeo.com/">먹튀검증</a>!!! I definately appreciate each and every piece of it and I have you bookmarked to look at new stuff of your blog an absolute necessity read blog!!!!

  • I am overwhelmed by your post with such a nice topic. Usually I visit your <a href="https://instarad.io/">안전놀이터</a> and get updated through the information you include but today’s blog would be the most appreciable. Well done!

  • What an interesting story! I'm glad I finally found what I was looking for <a href="https://zerostate.io/">메이저토토사이트</a>.

  • I think a lot of articles related to <a href="https://envoytoken.io/">메이저사이트</a> are disappearing someday. That's why it's very hard to find, but I'm very fortunate to read your writing. When you come to my site, I have collected articles related to this. My site name is .

  • Hello ! I am a student writing a report on the subject of your post.Your article is an article with all the content and topics. I've ever wanted . Thanks to this, it will be of great help to the report I am preparing now.Thanks for your hard work. And if you have time, please visit my site as well. The site name is <a href="https://tozents.com/">토토사이트</a>.

  • It seems to be a really interesting article. After reading this article, I thought it was interesting, so I wrote it. I hope you can come to my site, <a href="https://dian5643482.wixsite.com/dbmy">주식DB</a>, read it and enjoy it.

  • Hey there! I could have sworn I’ve been to this website before but after reading through some of the post I realized it’s new to me. Nonetheless, I’m definitely happy I found it and I’ll be book-marking and checking back frequently <a href="https://kipu.com.ua/">안전놀이터</a>

  • Your site is my favourite site because it made my job easier.If you want to see my work,follow my site customized packaging custom boxes
    which is just like yours

  • In my opinion, the item you posted is perfect for being selected as the best item of the year. You seem to be a genius to combine <a href="https://mtboan.com/">안전놀이터</a> and . Please think of more new items in the future!

  • To Play Poker in a Pandemic, Americans Flee the U.S.
    <a href="https://egg-bit77.com" rel="nofollow" >fx마진거래</a>

    To Play Poker in a Pandemic, Americans Flee the U.S.
    <a href="https://all24tv.com" rel="nofollow" >스포츠중계</a>
    click here
    <a href="https://www.racoonpw.com" rel="nofollow" >토토가족방</a>



    Unlike other sporting events canceled by the coronavirus, the World of Series of Poker, and its millions in prizes, went
    <a href="https://fxcare.co.kr" rel="nofollow">마진거래</a>

    online. But borders are tricky when it comes to internet gambling. <a href="https://www.racooncasino.com" rel="nofollow">에볼루션카지노</a>



    Three years ago, Maria Konnikova, a writer <a href="https://www.racooncasinog5.com" rel="nofollow">에볼루션카지노</a>



    for The New Yorker, came up with a brilliant stunt for a book about luck. A <a href="https://www.racoontoto.com" rel="nofollow">토토사이트</a>



    She gave herself a year to play, but something surprising happened: She started winning so much money that she put the book on hold.<a href="https://www.racoontowp.com" rel="nofollow">토토사이트</a>

  • To Play Poker in a Pandemic, Americans Flee the U.S.
    <a href="https://egg-bit77.com" rel="nofollow" >fx마진거래</a>

    To Play Poker in a Pandemic, Americans Flee the U.S.
    <a href="https://all24tv.com" rel="nofollow" >스포츠중계</a>
    click here
    <a href="https://www.racoonpw.com" rel="nofollow" >토토가족방</a>



    Unlike other sporting events canceled by the coronavirus, the World of Series of Poker, and its millions in prizes, went
    <a href="https://fxcare.co.kr" rel="nofollow">마진거래</a>

    online. But borders are tricky when it comes to internet gambling. <a href="https://www.racooncasino.com" rel="nofollow">에볼루션카지노</a>



    Three years ago, Maria Konnikova, a writer <a href="https://www.racooncasinog5.com" rel="nofollow">에볼루션카지노</a>



    for The New Yorker, came up with a brilliant stunt for a book about luck. A <a href="https://www.racoontoto.com" rel="nofollow">토토사이트</a>



    She gave herself a year to play, but something surprising happened: She started winning so much money that she put the book on hold.<a href="https://www.racoontowp.com" rel="nofollow">토토사이트</a>

  • Good day! This post could not be written any better! Reading this post reminds me of my previous room mate! He always kept chatting about this. I will forward this page to him. Pretty sure he will have a good read. Thanks for sharing. <a href="https://kipu.com.ua/">먹튀검증</a>

  • Good day! This post could not be written any better! Reading this post reminds me of my previous room mate! He always kept chatting about this.

  • I read this article. I think You put a great deal of exertion to make this article. I like your work

  • read this article. I think You put a great deal of exertion to make this article.

  • There is a bonus game on the second screen as well. Players have to select chilli stands in a fair

  • There is a bonus game on the second screen as well.

  • Are you the one who studies this subject?? I have a headache with this subject.<a href="https://glassjournalism.io"/>카지노사이트</a>Looking at your writing was very helpful.

  • Excellent read, I merely passed this onto a colleague who was doing little research on that. And the man actually bought me lunch because I found it for him smile So let me rephrase that: Thank you for lunch!

  • Super site! Custom Printing Service I am Loving it!! Will return once more, I am taking your food additionally, Thanks.

  • Get all Bangladesh education board result, Exam Routine, National University Result, HSC Result 2021, Alim Result 2021, JSC result 2021, HSC Admission Result, University Admission Circular, IPO Result 2021, Government Job in Bangladesh, and education news from our Government official website: <a href="https://allresultsall.com/"></a> or <a href="https://allresultbd24.com/"></a> Student or Candidate first & easily online University admission, Admit Card download, admission result, apply & download from our official website. https://allresultsall.com or https://allresultbd24.com

  • I always think about what is. It seems to be a perfect article that seems to blow away such worries. <a href="https://mtboan.com/">안전놀이터</a> seems to be the best way to show something. When you have time, please write an article about what means!!

  • We are really grateful for your blog post for giving a lot of information
    <a href="https://www.casinosite777.info" target="_blank" title="카지노사이트">카지노사이트</a>

  • Nice blog. Keep up the good work!
    <a href="https://www.baccaratsite.top" target="_blank" title="바카라사이트">바카라사이트</a>

  • Thanks for sharing this marvelous post. I m very pleased to read this article.
    <a href="https://www.sportstoto.zone" target="_blank" title="토토사이트">토토사이트</a>

  • Thanks for such a valuable post. I am waiting for your next post, I have enjoyed a lot reading this post keep it up.
    <a href="https://www.baccaratsite.biz" target="_blank" title="카지노사이트">카지노사이트</a>

  • I’m very happy to discover this web site. I need to to thank you for ones time for this particularly wonderful read!! I definitely enjoyed every part of it and i also have you book-marked to check out new information on your web site. <a href="https://kipu.com.ua/">먹튀검증</a>

  • درآموزش تعمیرات برد های الکترونیکی به شما نحوه تعمیرات انواع بردهای لوازم خانگی، تعمیرات بردهای صنعتی، تعمیرات برد پکیج، تعمیرات برد کولر گازی، تعمیرات برد اینورتر و ... آموزش داده خواهد شد.
    https://fannipuyan.com/electronic-boards-repair-training/

  • Usually I never comment on blogs but your article is so convincing that I never stop myself
    to say something about it.

  • Wow, great article post.Really looking forward to read more.

  • It as essentially a cool and beneficial piece of information.

  • Simply unadulterated brilliance from you here. I have never expected something not as much as this from you and <a href="https://twiddeo.com/">먹튀검증</a> have not confounded me by any reach out of the inventive vitality. I acknowledge you will keep the quality work going on.

  • If you are looking to buy home appliances in installments, you can refer to our site.

  • If you want to have a personal SMS system, you can visit our site.

  • Hello, i think that i saw you visited my site this i came to “return the favor”.I am trying to find things to
    enhance my web site!I suppose its ok to use a few of your ideas!! <a href="https://www.coincasino.top" target="_blank" title="카지노사이트">카지노사이트</a>

  • Fantastic work! This really can be the kind of data which needs to really be shared round the internet. Shame on Google for perhaps not placement this specific informative article much higher! <a href="https://www.meritcasino.net" target="_blank" title="바카라사이트">바카라사이트</a>

  • I wanted to say Appreciate providing these details, youre doing a great job with the site... <a href="https://www.roulettesite.top" target="_blank" title="룰렛">룰렛</a>

  • I’m thinking some of my readers might find a bit of this interesting. Do you mind if I post a clip from this and link back? Thanks <a href="https://remarka.kz/">토토사이트</a>

  • I want to start a blog to write about everything that happens at school and
    with friends…anonymously…any sugestions?.<a href="https://haebam.com" rel="nofollow">해외선물커뮤니티</a><br>

  • Every weekend i used to pay a quick visit this web site, because i want enjoyment, for the reason that this this
    web page conations really nice funny data too.<a href="https://jusoyo1.5to.me" rel="nofollow">토토사이트</a><br>

  • must say this blog loads a lot faster then <a href="https://envoytoken.io/">먹튀검증</a>.Can you suggest a good web hosting provider at a reasonableprice? Thank you, I appreciate it!

  • I think this is one of the most important info for me. And im glad reading your article. But should remark on few general things, The website style is great, the articles is really excellent

    <a href="https://www.sportstoto365.com" target="_blank" title="토토">토토</a>

  • It's really great. Thank you for providing a quality article. There is something you might be interested in. Do you know <a href="https://glassjournalism.io">바카라사이트</a>? If you have more questions, please come to my site and check it out!

  • Really appreciate you sharing this article. <a href="https://www.badugisite.net" target="_blank" title="온라인바둑이">온라인바둑이</a>

  • I will bookmark this site and come to it from time to time. Your writing has been of great help to me

  • Nice post. I learn something totally new and challenging on websites I stumbleupon on a daily basis. It will always be exciting to read content from other authors and use a little something from other web sites.

  • This blog was…great! how do you say it? Relevant!! Finally I’ve found something that helped me. Thanks!

  • SO good indeed! Glad to have found your page!! This is such great work!! Interesting to read for sure!!<a href="https://www.coincasino.top" target="_blank" title="온라인카지노">온라인카지노</a>

  • I wanted to say Appreciate providing these details, youre doing a great job with the site...Hard to ignore such an amazing article like this. You really amazed me with your writing talent. Thank for you shared again.<a href="https://www.meritcasino.net" target="_blank" title="바카라사이트">바카라사이트</a>



  • Fantastic work! This really can be the kind of data which needs to really be shared round the internet. Shame on Google for perhaps not placement this specific informative article much higher! <a href="https://www.roulettesite.top" target="_blank" title="카지노사이트">카지노사이트</a>

  • If you are looking for a van tour ticket, you can refer to our airline agency.

  • Great article with excellent idea! I have bookmarked your site since this site contains important data in it.

  • Really nice style and perfectly written content material in this. Material on this page is very efficient I’ve ever had. We do not need anything else. Thank you so much for the information.

  • Thanks for sharing.I found a lot of interesting information here. A really good post, very thankful and hopeful that you will write many more

  • Thanks for Nice and Informative Post. This article is really contains lot more information about This Topic -!!

  • Great Post !! Very interesting topic will bookmark your site to check if you write more about in the future.

  • This article is really fantastic and thanks for sharing the valuable post.

  • It is good to read blogs like this. constantly, we appreciate yourself assurance and accept as true within us.

  • Thanks for writing such a good article, I stumbled onto your blog and read a few post. I like your style of writing...

  • Great Post !! Very interesting topic will bookmark your site to check if you write more about in the future.

  • Very interesting topic will bookmark your site to check if you Post more about in the future.

  • Hey there, You’ve done an excellent job. I will definitely digg it and personally suggest to my friends. I’m confident they will be benefited from this website.<a href="https://www.coincasino.top" target="_blank" title="카지노사이트">카지노사이트</a>

  • thank you for sharing this useful article , and this design blog simple and user friendly regards.<a href="https://www.meritcasino.net" target="_blank" title="바카라사이트">바카라사이트</a>

  • Everyone an extremely breathtaking chance to read from this blog.
    It is always so lovely and jam-packed with a great time<a href="https://www.roulettesite.top" target="_blank" title="온라인카지노">온라인카지노</a>

  • <a href="https://www.casinosite777.info" target="_blank" title="온라인카지노">온라인카지노</a>
    https://www.casinosite777.info

  • Thank you for providing a good quality article.
    https://www.baccaratsite.top

  • Appreciate the effort and information you have given in writing this article .
    https://www.sportstoto.zone

  • Its an amazing website, I really enjoy reading your articles.
    https://www.baccaratsite.biz

  • Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..

  • Great web site you've got here.. It's difficult to find high-quality writing like <a href="https://envoytoken.io/">메이저토토사이트</a> nowadays. I seriously appreciate people like you! Take care!!

  • Damn, I've been looking for information like this for a while now. Thanks!

  • Many thanks for the article, I have a lot of spray lining knowledge but always learn something new. Keep up the good work and thank you again.

  • You made some good points there. I did a Google search about the topic and found most people will believe your blog.

  • You're so right. I'm there with you. Your weblog is definitely worth a read if anyone comes throughout it. Im lucky I did because now I've received a whole new view of this.

  • It's so interesting.<a href="https://kipu.com.ua/" target="blank">안전놀이터추천</a>Let's enjoy it together.

  • Thanks for ones marvelous posting! I really enjoyed reading it, you might be a great author.
    I will be sure to bookmark your blog and will eventually come back later on.<a href="https://haebam.com" rel="nofollow">해외선물대여계좌</a><br>

  • Attractive section of content. I simply stumbled upon your blog and in accession capital to assert that I acquire in fact enjoyed
    account your blog posts. Anyway I’ll be subscribing
    on your augment or even I success you access constantly quickly.<a href="https://jusoyo1.5to.me" rel="nofollow">링크사이트</a><br>

  • Hello, I am one of the most impressed people in your article. <a href="https://mtygy.com/">토토커뮤니티</a> I'm very curious about how you write such a good article. Are you an expert on this subject? I think so. Thank you again for allowing me to read these posts, and have a nice day today. Thank you.

  • Wow! This can be one particular of the most beneficial blogs We have ever arrive across on this subject.
    Feel free to visit my website: <a href="https://www.coincasino.top" target="_blank" title="코인카지노">코인카지노</a>

  • I would recommend your website to everyone. You have a very good gloss. Write more high-quality articles. I support you. Support my website <a href="https://www.meritcasino.net" target="_blank" title="메리트카지노">메리트카지노</a>

  • Hey there, You’ve done an excellent job. I will definitely dig it and personally suggest to my friends. I’m confident they will be benefited from this website.

    Feel free to visit my website: <a href="https://www.roulettesite.top" target="_blank" title="룰렛사이트탑">룰렛사이트탑</a>

  • Thank you for providing this source code.

  • whoah this blog is magnificent i love reading your posts. Keep up the good work!

  • I am no longer positive where you’re getting your info, however great topic.

  • He found what he was looking for in his inside pocket.
    How did you know it was me?
    https://www.totomazinga.com

  • He found what he was looking for in his inside pocket.
    How did you know it was me?

  • Thank you for providing this source code

  • It’s truly a nice and helpful piece of information. I’m happy that you simply shared this helpful information with us.

    Click here: https://www.coincasino.top

  • I am regular visitor, how are you everybody? This paragraph posted
    at this website is genuinely fastidious. <a href="https://www.meritcasino.net" target="_blank" title="온라인카지노">온라인카지노</a>


  • Уour blog providеd us useful information to work on. Үou have done a marvellous job!
    <a href="https://www.roulettesite.top" target="_blank" title="룰렛">룰렛</a>

  • Excellent post. I was checking continuously this blog and I’m impressed! Very helpful information specifically the last part. I care for such information much.
    Click here: <a href="https://www.coincasino.top" target="_blank" title="코인카지노">코인카지노</a>

  • I will bookmark this site and come to it from time to time. Your writing has been of great help to me.<a href="https://kipu.com.ua/">먹튀검증사이트</a>

  • This site seems to inspire me a lot. Thank you so much for organizing and providing this quality information in an easy to understand way. <a href="https://a-cm.com//">먹튀검증사이트</a> I think that a healthy era of big data can be maintained only when such high-quality information is continuously produced. And I, too, are working hard to organize and provide such high-quality information. It would be nice to come in once and get information. <a href="https://toto-times.com//">토토먹튀</a>

  • This site contains a lot of really good information. Lots of useful inaformation. <a href="https://a-cm.com//">먹튀</a> I'll add it to my bookmarks and stop by often. Maybe other visitors will think the same way as me. I hope you have a nice day today. Oh, it would be nice to visit our site and receive useful information. <a href="https://toto-times.com//">안전토토</a>

  • It's really great. Thank you for providing a quality article. There is something you might be interested in. Do you know https://glassjournalism.io 바카라사이트 ? If you have more questions, please come to my site and check it out!

  • This is my first time i visit here. I found so many interesting stuff in your blog especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here keep up the good work

  • Great goods from you, man. I have understand your stuff previous to and you’re just too fantastic. I really like what you have acquired here, certainly like what you are saying and the way in which you say it. <a href="https://www.badugisite.net" target="_blank" title="바둑이사이트넷">바둑이사이트넷</a>
    You make it enjoyable and you still care for to keep it sensible.

  • Write more, thats all I have to say. Literally, it seems as though you relied on the <a href="https://envoytoken.io/">안전놀이터주소</a> to make your point.

  • I think this is a real great blog post.Thanks Again. Cool.

  • Hurrah! Finally I got a website from where I be capable
    of truly take helpful facts regarding my study and knowledge.

  • Great article post.Really looking forward to read more.

  • I really like and appreciate your article.Really thank you! Keep writing.

  • Such a great blog.Thanks for sharing.........

  • I think this is a real great blog post.Thanks Again. Cool.

  • I am very happy to revisit your blog. Thanks to your posting, I am getting useful information today. Thank you for writing a good article. <a href="https://www.caa-il.com"> 안전놀이터 </a>

  • Thanks designed for sharing such a pleasant thinking, piece of writing is good

  • So how does our home cleaning assistance in Dubai give good results? We start in a exhaustive detail-clean for the duration of your apartment over the to begin with two cleans. On the pioneer clean, our cleaning service service will tidy your home, with wonderful attention within your kitchen not to mention bathrooms. At the second home cleaning workout, we’ll clean your own whole apartment, but this period we’ll furnish detail-clean services on your sleeping not to mention living sections. We’ll go on to maintain this unique detail-clean quality throughout your dwelling throughout a lot of our next visits by providing deep vacuuming services even on a rotating rationale.

  • <a href="https://www.ufabet1688x.com/">ufabet1688</a> You make so many great points here that I read your article a couple of times. Your views are in accordance with my own for the most part. This is great content for your readers.

  • That's a really impressive new idea! <a href="https://mtboan.com/">토토커뮤니티</a> It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.

  • Such an amazing and helpful post this is. I really really love it. It’s so good and so awesome. I am just amazed. I hope that you continue to do your work like this in the future also.
    Feel free to visit my website: <a href="https://www.texasholdemsite.info" target="_blank" title="텍사스홀덤사이트">텍사스홀덤사이트</a>

  • I think this is a real great blog post.Thanks Again. Cool.

  • thx for good information. if you are looking for a Panel SMS for your site just check our site.

  • if you are looking for a teaching EN just check our site for this work.

  • thank you for the articles
    that was good.

  • This is one of the best website I have seen in a long time thankyou so much, thankyou for let me share this website to all my friends
    https://www.casinosite777.info

  • This is really helpful post and very informative there is no doubt about it.
    https://www.baccaratsite.top

  • It’s so good and so awesome. I am just amazed. I hope that you continue to do your work like this in the future also.
    https://www.sportstoto.zone

  • I am really grateful for your blog post for giving a lot of information
    https://www.baccaratsite.biz

  • First of all, thank you for letting me see this information. I think this article can give me a lot of inspiration. I would appreciate <a href="https://glassjournalism.io">안전한카지노사이트</a> if you could post more good contents in the future.

  • Greetings! Very helpful advice in this particular article! It’s the little changes which will make the largest changes. Thanks for sharing https://kipu.com.ua/ 토토사이트

  • 토토사이트를 다른 은어로 놀이터라고 부릅니다. 안전놀이터란 검증이 완료 된 먹튀가 없는 토토사이트를 뜻합니다. 온라인으로 즐기는만큼 신중하게 생각하셔야 합니다. 안전한 놀이터는 3년 이상의 운영 기간과 구글 검색 시 사고가 없는 것이 확인 된 놀이터입니다. 혹여나 운이 나빠서 벌금에 처해질 수 있기에 스포츠토토를 즐길 때에는 안전을 가장 중요하게 생각해야합니다
    <a href="https://camo88.com/" > 토토사이트 </a> .

  • I really like and appreciate your blog article.Really thank you! Awesome.

  • Very helpful advice on this article! It is the little changes that make the biggest changes. Thanks a lot for sharing! <a href="https://www.ufabet1688x.com/">ยูฟ่าเบท168</a>

  • naturally like your website but you have to check the spelling on several of your posts[url=https://twiddeo.com/]메이저토토사이트[/url] Many of them are rife with spelling issues and I find it very troublesome to tell the truth nevertheless I will certainly come back again.

  • This is my first time i visit here. I found so many entertaining stuff in your blog, especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the leisure here! Keep up the good work. I have been meaning to write something like this on my website and you have given me an idea.

  • Hi, I do believe this is an excellent website. I stumbledupon it

  • I am in fact thankful to the owner of this website who has shared this enormous article at here.

  • There must have been many difficulties in providing this information.<a href="https://glassjournalism.io">카지노사이트</a> Nevertheless, thank you for providing such high-quality information.

  • اگر شما هم جزو کسانی هستید که به دنبال معتبرترین سایت کازینو فارسی هستند و یا برای انتخاب بهترین کازینو آنلاین فارسی دچار شک تردید هستید، سایت هات بت بهترین انتخاب پیش روی شماست. این سایت یک بستر عالی برای شرط بندی در بازی کازینو آنلاین بوده و با پشتیبانی از زبان فارسی، اعتبار بسیار بالایی دارد. یکی از بازی های محبوب کازینو بازی انفجار است. این بازی همچنین جزو محبوب ترین بازی های هات بت بوده و روزانه تعداد بسیار بالایی از کاربران آن را انجام می دهند. این حجم از محبوبیت این بازی به دلیل جذابیت و احتمال بالای کسب درآمد توسط کاربر در آن است.

  • The trial of former Justice Minister Cho Kuk and Dongyang University professor Jeong Kyung-shim over the corruption in the entrance examination begins again this week. The trial has been postponed indefinitely for about six months due to the spread of COVID-19.

    According to the court on the 6th, the Seoul Central District Court's Criminal Settlement Division 21-1 (Chief Judge Ma Seong-young Kim Sang-yeon Kim Sang-yeon Jang Yong-beom) was indicted on the 11th at 10 a.m. on charges of abuse of power and obstruction of the exercise of rights, etc. Conduct a trial date
    <p>Thank you and thank you so much. I&#8217;ll share you useful information.
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">성인용품</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">오나홀</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">여성성인용품</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">남성성인용품</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">우머나이저</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">딜도</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">여성딜도</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">벨트딜도</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">성인몰</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">애널용품</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">sm용품</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">클리흡입진동기</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">페어리킹콩</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">핸드잡</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">남성자위기구</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">여성자위용품</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">여성자위도구</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">성인용품</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">성인용품점</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">성인기구</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">바이브레이터</a></p>
    <a href="https://blackbunny.co.kr" rel="nofollow ugc">흡입바이브레이터</a></p>
    <a href="https://blackbunny.ne.kr" rel="nofollow ugc">콘돔</a></p>
    <a href="https://blackbunny.ne.kr" rel="nofollow ugc">콘돔샵</a></p>
    <a href="https://blackbunny.ne.kr" rel="nofollow ugc">러브젤</a></p>
    <a href="https://blackbunny.ne.kr" rel="nofollow ugc">성인용품</a></p>
    <a href="https://blackbunny.ne.kr" rel="nofollow ugc">남성성인용품</a></p>
    <a href="https://blackbunny.ne.kr" rel="nofollow ugc">여성성인용품</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">온라인광고</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">바이럴마케팅</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">광고</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">상위노출</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">사이트상위노출</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">웹사이트상위노출</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">검색엔진최적화</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">네이버상위노출</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">구글상위노출</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">SEO</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">SEO최적화</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">백링크</a></p>
    <a href="http://youandjunseo.co.kr" rel="nofollow ugc">홈페이지제작</a></p>

  • When I read an article on this topic, <a href="https://mtboan.com/">먹튀검증커뮤니티</a> the first thought was profound and difficult, and I wondered if others could understand.. My site has a discussion board for articles and photos similar to this topic. Could you please visit me when you have time to discuss this topic?

  • What an interesting story! I'm glad I finally found what I was looking for Excellent reading <a href="https://www.yadong.biz" target="_blank" title="야동비즈">야동비즈</a>

  • Very good article! We will be linking to this great content on our site. Keep up the good writing https://www.yahanvideo.net

  • I admire this article for the well-researched content and excellent wording. I got so involved in this material that I couldn’t stop reading. I am impressed with your work and skill. Thank you so much

  • Really satisfied with all the information I have found in this article. It gives immense knowledge on physical education, it is very helpful and quite generous to spread a good message.

  • I got a web site from where I be capable of really obtain valuable information regarding my study and knowledge.
    Great Article… Good Job

  • Excellent post. I was checking continuously this blog and I’m impressed! Very helpful information specifically the last part. I care for such information much.<a href="https://www.badugisite.net" target="_blank" title="온라인바둑이">온라인바둑이</a>
    ‮‬

  • I want to to thank you for this good read!! I definitely enjoyed every little bit of it.<a href="https://www.pharaohcasino.net" target="_blank"title="바카라사이트">바카라사이트</a>
    I’ve got you book-marked to look at new stuff you post…

  • Your writing is perfect and complete. <a href="https://mtboan.com/">토토커뮤니티</a> However, I think it will be more wonderful if your post includes additional topics that I am thinking of. I have a lot of posts on my site similar to your topic. Would you like to visit once?

  • Additional remedies include Reiki and energy therapy, chiropractic therapy, massage, meditation and visualization, acupuncture, diet and nutrition, exercise, stretching and deep breathing exercises. salvia for sale
    <a href="https://www.sportstoto365.com" target="_blank" title="사설토토">사설토토</a>

  • This type of article will be able to think and analyzed to the readers thats leads them in a bright future.
    <a href="https://www.baccaratsite.win" target="_blank" title="바카라사이트윈">바카라사이트윈</a>

  • I was looking it for so long , and i found it finally that i know it will help me .
    <a href="https://www.sportstoto365.com" target="_blank" title="배트맨토토">배트맨토토</a>

  • Pretty nice post. I just stumbled upon your weblog and wanted to say that I have really enjoyed browsing your blog posts. After all I’ll be subscribing to your feed and I hope you write again soon!

  • Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..

  • I definitely enjoying every little bit of it. It is a great website and nice share. I want to thank you. Good job! You guys do a great blog, and have some great contents. Keep up the good work.

  • Thank you for another great article. Where else could anyone get that kind of information in such a perfect way of writing? I have a presentation next week, and I am on the look for such information.

  • I read your article very interestingly. I have been very interested in this topic recently and have been looking for resources on it. Your post has been very helpful.

  • I've seen articles on these topics a few times, but I think your writing is the cleanest I've ever seen. I would like to refer to your article on my blog and write it.<a href="https://remarka.kz/">먹튀검증커뮤니티</a>

  • Respect to post author, some fantastic information

  • This is one very interesting post. I like the way you write and I will bookmark your blog to my favorites.

  • Nice information, valuable and excellent design, as share good stuff with good ideas and concepts.

  • I used to be able to find good info from your articles.

  • As soon as I noticed this web site I went on reddit to share some of the love with them.

  • very god

  • I guess if you can get Brian in here to comment three times you can get me to do it once.
    https://main7.net/first/

  • Along the lines Simon is talking about, I got a fair number when I spelled Tim Ferriss’ name wrong. Unfortunately, Tim Ferriss wasn’t one of them. This is perhaps because he has a Google alert on his name spelled correctly.

  • I just let my community know I’m not an expert. I describe what worked for me and ask them what works for them and discussion ensues.

  • This type of message always inspiring and I prefer to read quality content, so happy to find good place to many here in the post, the writing is just great, thanks for the post.

  • Hey man, .This was an excellent page for such a hard subject to talk about. I look forward to reading many more great posts like these. Thanks

  • Fantastic website. A lot of helpful info here. I am sending it to some friends ans additionally sharing in delicious. And obviously, thank you to your effort!

  • I wanted to thank you for this excellent read!! I definitely loved every little bit of it. I have you bookmarked your site to check out the new stuff you post.


  • I got too much interesting stuff on your blog. I guess I am not the only one having all the enjoyment here! Keep up the good work.
    <a href="https://www.yadong.biz" target="_blank" title="한국야동">한국야동</a>

  • I felt very happy while reading this site. This was really very informative site for me. I really liked it. This was really a cordial post. Thanks a lot!.

  • This was a really great contest and hopefully I can attend the next one. It was alot of fun and I really enjoyed myself

  • I am sure this piece of writing has touched all the internet users, its really really fastidious piece
    of writing on building up new weblog.

  • It would bring high impact to the reader and could bring life changing by knowing it.

  • I am sure this piece of writing has touched all the internet users, its really really fastidious piece
    of writing on building up new weblog.

  • http://maps.google.com/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.de/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.co.jp/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.es/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.br/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.uk/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.fr/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.it/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ru/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.pl/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ca/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.nl/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.co.in/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.tw/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.id/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.ua/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.cz/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.mx/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.au/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.be/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.co.th/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.se/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.pt/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ro/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.gr/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.ar/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.tr/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.dk/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.hu/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://images.google.com/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.ch/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.at/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.fi/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.vn/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.kr/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.no/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.bg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.cl/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.co/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.my/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.sg/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.ie/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.ph/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.il/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.pe/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.nz/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://cse.google.com/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.za/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.hr/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.si/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ae/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.hk/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.sa/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.lv/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.pk/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.eg/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.ec/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.pr/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.rs/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.uy/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.lu/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.do/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.cr/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.ke/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.bw/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.is/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.by/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.gt/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.cu/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.ma/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.lk/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.ng/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.ps/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.tn/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.dir.bg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.bd/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.mu/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.bo/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.hn/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.kz/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.ni/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.sv/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.cat/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.np/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.lb/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.af/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.nanigans.com/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ba/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.kh/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.dz/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.mt/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.jo/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ge/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.qa/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.as/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.kw/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.iq/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.wikivand.ir/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.bs/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ci/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.kg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.sn/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.bi/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.mn/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.az/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.cm/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.fm/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.pa/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://ditu.google.com/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.tj/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.rw/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.om/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.uz/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.ag/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.et/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.md/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.ly/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.bz/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.co.ck/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.ai/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.cy/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.gi/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.tm/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.mw/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.sc/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.co.tz/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.mm/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.st/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.vg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.vc/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.gm/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.la/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.mk/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.co.zw/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.bn/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://google.com.pg/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.dex.hu/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.fj/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.cg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.gg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.cd/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.gl/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.al/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ki/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.bj/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.co.vi/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.ws/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.gp/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.dj/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.bf/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.sb/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.nu/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.to/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.cv/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.tg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ga/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.so/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.nr/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.gy/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.bt/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.co.ao/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.mg/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ml/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://google.com.sl/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.cf/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ne/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.ac/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.td/url?sa=t&url=http%3A%2F%2Ftarjome100.ir
    http://clients1.google.com/url?q=http%3A%2F%2Fwww.tarjome100.ir
    http://clients1.google.ng/url?sa=t&url=http%3A%2F%2Ftarjome100.ir

  • Your writing is perfect and complete. https://www.mtboan.com/
    토토커뮤니티 However, I think it will be more wonderful if your post includes additional topics that I am thinking of. I have a lot of posts on my site similar to your topic. Would you like to visit once?

  • This is the perfect post.<a href="https://mtboan.com/">토토커뮤니티</a> It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.

  • <a href="https://www.studymaterials.com.ng/brisin-recruitment-past-questions-and-answers/">Get an updated BRISIN past questions and answers here</a>

    <a href="https://www.studymaterials.com.ng/cita-petroleum-recruitment-past-questions-and-answers/">Download CITA petroleum past questions and answers in our page</a>

    <a href="https://www.studymaterials.com.ng/maersk-pli-recruitment-past-questions-and-answers/">Visit studymaterials.com.ng for an updated study pack for any external exams or job interview</a>

    <a href="https://www.studymaterials.com.ng/notore-aptitude-test-past-questions-and-answers/">Get all the information you need concerning passing recruitment exams in Nigeria here</a>

  • Your intelligence every day surprises me! I think it's a perfect analysis. I want to share more information with you, please come to my blog (<a href="https://instarad.io/" target="_blank">안전놀이터추천</a> ) and send me a message!

  • Your intelligence every day surprises me! I think it's a perfect analysis. I want to share more information with you, please come to my blog (<a href="https://instarad.io/" target="_blank">안전놀이터추천</a> ) and send me a message!

  • I love seeing more and more people visiting your blog. I, who have been together for a long time, created a forum with the same topic as yours this time. The subject is going to be captured by <a href="https://zerostate.io/" target="_blank">메이저놀이터추천</a>.

  • It is very difficult to meet someone who suits my taste. I haven't met a lot, but I am very happy to find someone who writes an article that suits my taste. Collecting these kinds of articles is my hobby, but once you come to my site, <a href="https://dian5643482.wixsite.com/dbmy" target="_blank">주식DB</a> and enjoy, I would appreciate it.

  • I love coding and whatever it's related. I came up with an idea after reading your post.
    Thank you again

  • Looking at this article, I miss the time when I didn't wear a mask. <a href="https://mtboan.com/">먹튀검증커뮤니티</a> Hopefully this corona will end soon. My blog is a blog that mainly posts pictures of daily life before Corona and landscapes at that time. If you want to remember that time again, please visit us.

  • Many thanks for your assistance in our project it was great

  • Just a smiling visitor here to share the love (:, btw outstanding layout.

  • Wonderful work! This is the type of info that are meant to be shared across the web. Shame on the seek engines for no longer positioning this submit upper! Come on over and seek advice from my web site . Thanks =)

  • I procrastinate a lot and don’t manage to get nearly anything done. waiting for your further write ups thanks once again.

  • Great blog here! Also your website loads up fast! What web host are you using? Can I get your affiliate link to your host? I wish my web site loaded up as fast as yours lol

  • It is very useful information to read.

  • As I am looking at your writing, <a href="https://mtboan.com/">먹튀검증사이트</a> I regret being unable to do outdoor activities due to Corona 19, and I miss my old daily life. If you also miss the daily life of those days, would you please visit my site once? My site is a site where I post about photos and daily life when I was free.

  • naturally like your website but you have to check the spelling on several of your posts l] Many of them are rife with spelling issues and I find it very troublesome to tell the truth nevertheless I will certainly come back again.

  • Pretty nice post. I just stumbled upon your weblog and wanted to say that I have really enjoyed browsing your blog posts. After all I’ll be subscribing to your feed and I hope you write again soon!

  • First of all, thank you for your post. https://mtboan.com/ 메이저사이트 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^

  • <a href="https://www.nca12.com" target="_blank">제왕카지노</a>This is energizing, in any case it is imperative for you to visit this particular https://www.nca12.com

  • I'm so happy to finally find a post with what I want. <a href="https://envoytoken.io/">안전놀이터순위</a> You have inspired me a lot. If you are satisfied, please visit my website and leave your feedback.



  • <a href="https://www.yjc.ir/fa/news/7640573/%D9%85%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%AC%D9%86%D8%A7%DB%8C%D8%AA-%D8%AF%D8%B1-%D9%BE%D9%88%D8%B4%D8%B4-%D9%84%D9%88%D9%84%D9%87-%D8%A8%D8%A7%D8%B2%DA%A9%D9%86%DB%8C-%D8%B4%D9%85%D8%A7%D9%84-%D8%AA%D9%87%D8%B1%D8%A7%D9%86">لوله باز کنی شمال تهران</a> خدمات خود را به صورت شبانه روزی و 24 ساعته ارائه میدهد. لوله بازکن های شمال تهران بلافاصله پس از تماس شما در کمتر از 20 الی 30 دقیقه خود را به محل مورد نظر می رسانند و پس از تشخیص نوع و میزان گرفتگی، با بهترین تجهیزات لوله ببازکنی، اقدام به رفع گرفتگی لوله فاضلاب می کنند




    سایت برچسب با در نظر گرفتن راحتی و رفاه شهروندان، سعی دارد بهترین سبک را برای ارائه خدمات <a href="https://eco.shafaqna.com/FA/259759/%d9%86%d8%b2%d8%af%db%8c%da%a9-%d8%aa%d8%b1%db%8c%d9%86-%d9%84%d9%88%d9%84%d9%87-%d8%a8%d8%a7%d8%b2%da%a9%d9%86%db%8c-%d8%b4%d8%b1%d9%82-%d8%aa%d9%87%d8%b1%d8%a7%d9%86-%d8%b1%d8%a7-%d8%af%d8%b1-1/">لوله بازکنی شرق تهران</a> انتخاب کند. به این صورت که تنها با وارد شدن به صفحه مربوطه در سایت، می توانید لیستی از شماره تماس های نزدیک ترین افراد لوله بازکن را در بالای صفحه مشاهده کنید و بر اساس نظرات مشتریان قبلی با بهترین آن ها تماس بگیرید


    اگر در تهران هستید می توانید برای پیدا کردن بهترین لوله بازکن در نزدیکی منزلتان به سایت لوله بازکنی برچسب مراجعه کنید و نام منطقه خود را در کادر جستجو وارد کنید؛ مثلا اگر در سعادت آباد هستید برای استفاده از
    <a href="https://parsizi.ir/36053-2-ellat-gereftegi-looleh/">لوله بازکنی سعادت آباد </a> فقط کافی است نام سعادت آباد را جستجو کرده تا به شماره تماس لوله بازکن های سیار این منطقه دسترسی داشته باشید.


    اگر شما در ستارخان تهران سکونت دارید میتوانید با مراجعه به صفحه <a href="http://parsinews.ir/news/page/346e589de4966272d0f79f29ef040aa9">لوله باز کنی ستار خان</a>
    ، شماره نزدیکترین لوله بازکن به خودتان را مشاهده کنید و فقط با یک تماس ایشان را به کار دعوت کنید


    <a href="https://aftabnews.ir/fa/news/266812/%D9%85%D8%AA%D8%AE%D8%B5%D8%B5%DB%8C%D9%86-%D9%84%D9%88%D9%84%D9%87%E2%80%8C%D8%A8%D8%A7%D8%B2%DA%A9%D9%86%DB%8C-%D8%BA%D8%B1%D8%A8-%D8%AA%D9%87%D8%B1%D8%A7%D9%86-%D8%B1%D8%A7-%D8%AF%D8%B1-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A8%D8%B1%DA%86%D8%B3%D8%A8-%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D9%86%DB%8C%D8%AF">لوله باز کنی غرب تهران</a>
    با ارائه خدمات شبانه‌روزی و همه روزه در زمینه رفع گرفتگی در انواع لوله‌های فاضلاب شهری در آشپزخانه، سرویس بهداشتی، حیاط و... توانسته رضایت شهروندان را به خود جلب کند


    برای استفاده از خدمات سایت برچسب مثلا اگر در شهرک غرب تهران هستید فقط کافی است به آن مراجعه کنید و در صفحه اول این سایت نام شهرک غرب را جستجو کنید تا به صفحه <a href="https://www.bultannews.com/fa/news/714317/%D9%84%D9%88%D9%84%D9%87-%D8%A8%D8%A7%D8%B2%DA%A9%D9%86%DB%8C-%D8%A8%D8%B1%DA%86%D8%B3%D8%A8-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%D8%AF%D8%B1-%D8%B4%D9%87%D8%B1%DA%A9-%D8%BA%D8%B1%D8%A8-%D8%AA%D9%87%D8%B1%D8%A7%D9%86">لوله باز کنی شهرک غرب</a>
    منتقل شوید و نام لوله بازکن های نزدیک آن منطقه را مشاهده کنید، و با هر کدام از آنها که خواستید تماس بگیرد تا خودشان را در کمتر از نیم ساعت به شما برسانند


    <a href="https://www.yjc.news/fa/news/7772238/%D9%84%D9%88%D9%84%D9%87-%D8%A8%D8%A7%D8%B2%DA%A9%D9%86%DB%8C-%D8%B4%D9%87%D8%B1%D8%A7%D9%86-%D8%A8%D8%B1%DA%86%D8%B3%D8%A8-%D8%AF%D8%B1-1-%D8%AF%D9%82%DB%8C%D9%82%D9%87-%D9%84%D9%88%D9%84%D9%87-%D8%A8%D8%A7%D8%B2%DA%A9%D9%86-%D9%85%D8%A7%D9%87%D8%B1-%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D9%86%DB%8C%D8%AF">لوله باز کنی شهران</a> سایت برچسب در راستای وظایف خود خدمات زیرا را ارائه می دهد: رفع گرفتگی لوله فاضلاب در شهران بازکردن توالت فرنگی و ایرانی در کمترین زمان، رفع گرفتگی چاه حمام در شهران، در آوردن اشیاء قیمتی مثل دسته کلید و سویچ و طلاو ... از چاه دستشویی و کلی خدمات دیگر که شما برای استفاده از آنها فقط کافی است روی لینک صفحه لوله بازکنی شهران بزنید تا بعد از تماس شما یکی از بهترین لوله بازکن های ماهر و کاربلد در شهران در کمتر از نیم ساعت خودش را به شما برساند و بتواند کار شما را انجام دهد.



  • What a post I've been looking for! I'm very happy to finally read this post. <a href="https://mtygy.com/">토토커뮤니티</a> Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.

  • Your website is really cool and this is a great inspiring article.

    https://pieville.net/web/accounts/163685


  • گرفتگی لوله های فاضلاب موجوداز مشکلات رایج هر خانه ای می باشد.استفاده از قویترین محلول لوله بازکن، یکی از بهترین و سریع ترین راه ها برای رفع این مشکل می باشد، البته به شرط اینکه آنها را بشناسید و با شرایطی ایمن از آنها استفاده نمایید.ما در سایت برچسب "barchasb.net”با معرفی <a href="https://barchasb.net/blog/types-of-pipe-unblocker/">قویترین محلول لوله بازکن</a>، مشخصات، کارآیی و مزایای آن، شما را در انتخاب و قویترین محلول لوله باز کن و با کیفیت راهنمایی کنیم تا بتوانید بهترین مارک لوله بازکن را تهیه کنید

  • It's something the city is keen to change. Prague has been a magnet for tourists for a long time. But their rising numbers have become a worry for its residents, who feel overrun by rowdy groups looking for a big night out.
    <a href=" https://www.yert200.com ">카지노사이트</a>

  • Like other cities in similar situation, Prague has put in place a "nighttime mayor" whose task is to find a better way to handle the crowds.
    https://www.shine900.com

  • "We care the most for more conscientious tourists who respect the fact that tourism must not be detrimental to the lives of the locals," he said. "Prague simply cannot be just an open-air museum for tourists, we need to stop the outflow of locals from the city center."
    https://www.gain777.com

  • The Rasin Riverside, south from the city center, rose from a near abandonment to popular hipster hangout to a mainstream tourist destination within a decade. Some locals preferred the spot when it was still a bit rough around the edges and are moaning its evolution into a more polished space, but the riverbank's rising popularity gives tourists a chance to sample something a little bit different.
    https://www.kkr789.com

  • Jatka 78's co-founder and director Štěpán Kubišta is particularly proud of the international nature of the institution he helped to build. The venue regularly hosts foreign troupes and is one of the few theaters in Prague serving locals and tourists alike.
    https://www.aace777.com

  • It's a tradition started by one of Prague's most famous residents, the country's former President Vaclav Havel. When he hosted Bill Clinton in 1993, he showed him around the castle, then took the then-President to a legendary, if somewhat grubby
    https://www.rcasinosite.com

  • Zizkov, once known as the slightly rough neighborhood lying under Prague's famous TV tower, has always had a diverse cultural scene. From the U Vystrelenyho Oka pub that has long been the beating heart of Prague's underground scene, to independent art galleries and the newly reopened events space in the functionalist Radost building, Zizkov, Kasparova says, has something for everyone.
    https://www.kakeriun.com

  • She is looking to follow Holesovice's example in introducing more contemporary art into the district, while maintaining its appeal to the neighborhood's long-time residents. "When people walk into a gallery showing contemporary art, they can sometimes get a bit frightened, not sure what to make of it. We want to bring art to people in a way that isn't scary, through themes they can relate to," she said.
    https://www.hgame56.com

  • I've been looking for photos and articles on this topic over the past few days due to a school assignment, 메이저놀이터순위 and I'm really happy to find a post with the material I was looking for! I bookmark and will come often! Thanks :D

  • That's a really impressive new idea! <a href="https://envoytoken.io/">안전한놀이터</a> It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.

  • This is my first time i visit here. I found so many entertaining stuff in your blog, especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the leisure here! Keep up the good work. I have been meaning to write something like this on my website and you have given me an idea. 온라인포커

  • خدمات تصميم المواقع

  • تصميم مواقع

  • e contemporary art into the district, while maintaining its appeal to the neighborhood's long-time residents. "When people walk into a gallery

  • Hi ! I specialize in writing on these topics. My blog also has these types of articles and forums. Please visit once. <a href="https://kipu.com.ua/">메이저놀이터</a>

  • this is great

  • Hello, I read the post well. <a href="https://envoytoken.io/">안전놀이터추천</a> It's a really interesting topic and it has helped me a lot. In fact, I also run a website with similar content to your posting. Please visit once

  • Actually Magnificent. I am also a specialist in this topic so I can understand your effort.

  • Thank you. I authentically greeting your way for writing an article. I safe as a majority loved it to my bookmark website sheet list and will checking rear quite than later. Share your thoughts.

  • Hi ! I specialize in writing on these topics. My blog also has these types of articles and forums. Please visit once. <a href="https://kipu.com.ua/">메이저놀이터</a>

  • that was very good

  • I guess I really got sucked into your blog because when I saw the time I was surprise to see that I've spent over 5 or so hours on your article.
    I am really blown away at how slow your page loaded on my phone.|This write up definitely has all of the info and facts anyone could want.|This website sure did jump started my interest.
    I was checking out a bean bag chair earlier but I still This information you are providing is magnificent. I really like this style of writing and how well the ideas are conveyed. You really have an amazing way of thinking about things.<a href="https://bamgosoo.com" rel="nofollow">강남오피</a><br>

  • Wow, this paragraph is good, my <a href="https://envoytoken.io/">메이저토토사이트</a> is analyzing these things, so I am going to inform her.

  • found a web page with content that you might find interesting. If you're interested, please click the hyperlink<a href="https://www.mukgum.com/scam-website/">먹튀사이트</a>

  • Hi, Neat post. There's a problem together with your site in web explorer, would check this?
    IE still is the market chief and a good part of other people will miss your excellent writing
    due to this problem.

    Look at my page :: <a href="https://bamgosoo.com" rel="nofollow">오피</a><br>

  • this web site is genuinely nice and the people are Wow, great blog article

  • That's amazing. I grow up watching this. Appreciate you my own blog and would like to find out where u got this from.

  • I feel the same way as the writer. I hope this content will be exposed to many people.<a href="https://www.mukgum.com/scam-website/">먹튀사이트</a>

  • written article, if only all bloggers offered the same content as you, the internet would be a far better place <a href="https://www.aneighborhoodcafe.com">토토사이트검증</a>

  • Today, business calls play a very important article, if only all bloggers offered the same content as you, the internet would be a far better place <a href="https://www.yafray.org">안전놀이터</a>

  • browsed most of your posts. This post is probably where I got the most the fantasti c lucidity in your writing. I will instantly grab

  • What's up, after reading this remarkable piece
    of writing i am also glad to share my know-how here with mates. <a href="https://bamgosoo.com" rel="nofollow">오피사이트</a><br>

  • Your blog is very useful for me.I really like you post.Thanks for sharing. Please click this post,if you wanna join casino online. Thank you. <a href="https://www.ufabet1688x.com/">ufabet168</a>

  • Hurrah, that's what I was looking for, what a material! existing here at this website, thanks admin of this web page.Feel free to surf to my webpage - <a href="https://bamgosoo.com" rel="nofollow">부산오피</a><br> When some one searches for his vital thing, thus he/she desires to be available
    that in detail, so that thing is maintained over here.


  • You have lots of great content that is helpful to gain more knowledge. Best wishes.

  • Heya i am for the first time here. I found this board and I to find It truly helpful & it helped me out much. I am hoping to give something again and aid others such as you helped me.

  • I have been browsing online greater than three hours lately, yet I by no means discovered any interesting article like yours. It is pretty price sufficient for me. In my opinion, if all website owners and bloggers made good content material as you probably did, the internet will be a lot more useful than ever before.

  • Actually no matter if someone doesn't be aware of after that its up to other users that they will help, so here it takes place.

  • Wish you a good luck with best wishes. Your web page is excellent, carry on your good job.

  • Hi there excellent blog! Does running a blog like this take a lot of work?
    I’ve very little knowledge of coding but I was hoping to start my own blog in the near future.
    Anyways, should you have any ideas or techniques for new blog owners please share.
    I know this is off subject nevertheless I simply wanted to ask.
    Thank you!

  • Excellent Article!!! I like the helpful information you provide in your article.

  • Your blogs are up to the mark, such an excellent post.

  • Daily I visit most of the web pages to get new stuff. But here I got something unique and informative.

  • Yeahh!!! Here I got it what I exactly needs. Such a great job!!

  • Wonderful experience while reading your blog.

  • I check your blog again and again. Best of luck for your new article.

  • It’s such a great and useful piece of the information. I am very happy that you give precious time to us by sharing such a great information.

  • Your this content is what I was exactly searching for ?

  • I am really really impressed with your writing skills as well as with the layout on your blog.

  • Pretty! This was an extremely wonderful article. Thanks for
    supplying this info.

  • What’s up it’s me, I am also visiting this website
    regularly, this web page is really good and the users
    are in fact sharing nice thoughts.

  • Think about the sorts of items you use a lot of in a two-week period. Paper goods are probably at the top of this list, including things

  • able to deliver groceries right to your door, including long-lasting nonperishables like canned vegetables, rice, beans, nuts and more. Frozen foods could also be beneficial if you’re looking to cook for a family.

  • Good way of presenting this article. Magnificent site, got lots of useful information here.

  • Really enjoyed your post! Keep up the good writing.

  • Happy reading this article.? One of the most important information for me.

  • Hey thank you!!! I was seeking for the particular information for long time. Good Luck ?

  • Your site has a wide collection of fantastic blogs that helps a lot.

  • I check your blog again and again. Best of luck for your new article

  • I check your blog again and again. Best of luck for your new article.

  • Your site has a wide collection of fantastic blogs that helps a lot.

  • Hey thank you!!! I was seeking for the particular information for long time. Good Luck ?

  • Really this is a good submit. I m happy that finally someone writes about it.


  • شما در هر محله تهران که باشید می توانید در سایت <a href="https://barchasb.net/">لوله باز کنی برچسب</a> نام منطقه خود را جستجو نموده و نزدیک ترین لوله بازکن ها به منطقه خود را بیابید. سپس از بین لیست افراد لوله بازکن، اقدام به انتخاب یکی از آن ها و تماس با آن نمایید تا در سریع ترین زمان ممکن در محل شما برای سرویس دهی حاضر شوند. خدمات لوله بازکنی در سایت برچسب barhasb.net” “به صورت 24 ساعته و شبانه روزی ارائه می شود و افراد لوله بازکن در هر ساعت از شبانه روز آماده ارائه خدمات به مشتریان گرامی می باشند.

  • I’ve joined your rss feed and look forward to seeking more of your
    fantastic post. Also, I have shared your web site in my social
    networks!

  • Easily, the article is actually the best topic on this registry related issue. I fit in with your <a href="https://twiddeo.com/" target="_blank">먹튀검증사이트</a> and will eagerly look forward to your next updates. Just saying thanks will not just be sufficient, for the fantastic lucidity in your writing. I will instantly grab your rss feed to stay informed of any updates

  • I've been troubled for several days with this topic. <a href="https://crown999.vn/">Kèo nhà cái</a>, But by chance looking at your post solved my problem! I will leave my blog, so when would you like to visit it?

  • I’ve joined your rss feed and look forward to seeking more of your
    fantastic post. Also, I have shared your web site in my social
    networks!

  • I accidentally searched and visited your site. I still saw several posts during my visit, but the text was neat and readable. I will quote this post and post it on my blog. Would you like to visit my blog later? <a href="https://envoytoken.io/">메이저놀이터추천</a>

  • I’m very happy to discover this web site. I need to to thank you for ones time for this particularly wonderful read!! I definitely enjoyed every part of it and i also have you book-marked to check out new information on your web site. <a href="https://mtboan.com/">안전놀이터순위</a>

  • Good day very nice website!! Guy .. Beautiful .. Superb .. I will bookmark your web site and take the feeds also…I’m happy to search out numerous helpful info here in the put up, we need work out more techniques in this regard, thank you for sharing.

    https://www.coincasino.top

  • I am happy to find this post Very useful for me, as it contains a lot of information. I Always prefer to read The Quality and glad I found this thing in you post. Thanks

    https://www.roulettesite.top

  • Thanks for a marvelous posting! I actually enjoyed reading it, you might be
    a great author.I will be sure to bookmark your blog and will
    often come back at some point. I want to encourage yourself to continue your great posts,
    have a nice day!

    my web page;<a href="https://bamgosoo.com" rel="nofollow">안마</a><br>

  • This is one very interesting post. I like the way you write and I will bookmark your blog to my favorites. <a href="https://remarka.kz/">사설토토사이트</a>

  • I basically need to disclose to you that I am new to weblog and unquestionably loved this blog website. Likely I'm going to bookmark your blog . You totally have magnificent stories. Cheers for imparting to us your [url=https://twiddeo.com/]사설토토사이트[/url]

  • Easily, the article is actually the best topic on this registry related issue. I fit in with your conclusions and will eagerly look forward to your next updates.

  • You absolutely come with really good articles and reviews. Regards for sharing with us your blog.

  • Ovatsap has finally experimented with several normally independent devices, and once this feature is enabled, you no longer need the Internet to use the web or desktop version of WhatsApp because this is not a big change.

  • good baby.

  • <a href="https://www.blackjacksite.top" target="_blank" title="블랙잭사이트">블랙잭사이트</a>

    When someone writes an post he/she retains the

    image of a user in his/her brain that how a user can understand it.

    Thus that’s why this article is great. Thanks!

  • <a href="https://www.texasholdemsite.info" target="_blank" title="텍사스홀덤사이트">텍사스홀덤사이트</a>Hey there! This post could not be written any better!
    Reading this post reminds me of my good old
    room mate! He always kept chatting about this. I will forward this post to
    him. Pretty sure he will have a good read. Many thanks for sharing!

  • <a href="https://www.pachinkosite.info/" target="_blank" title="파칭코사이트인포">파칭코사이트인포</a>Thank you for any other magnificent article. The place else

    may just anyone get that type of information in such an ideal way of writing?

    I have a presentation subsequent week, and I am at the look for

    such info.

  • That's a great article! The neatly organized content is good to see. Can I quote a blog and write it on my blog? My blog has a variety of communities including these articles. Would you like to visit me later? <a href="https://envoytoken.io/">메이저안전놀이터</a>

  • Greetings! Very helpful advice in this particular article! It’s the little changes which will make the largest changes. Thanks for sharing <a href="https://mtboan.com/">안전놀이터</a>

  • This is one very interesting post. I like the way you write and I will bookmark your blog to my favorites. 사설토토사이트

  • i like this blog very much its a ratting nice situation to

    click here<a href="https://casinogaja.com" rel="nofollow">온라인바카라</a><br>

  • I've seen articles on the same subject many times, but your writing is the simplest and clearest of them. I will refer to https://kipu.com.ua/ 메이저놀이터추천

  • First of all, thank you for your post. <a href="https://crown999.vn/">Bóng88</a> Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^

  • First of all, thank you for your post. Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^ 먹튀커뮤니티

  • i like this blog very much its a ratting nice situation to

    click here<a href="https://casinogaja.com" rel="nofollow">바카라</a><br>

  • I am sure this piece of writing has touched all the internet users, its really really fastidious piece
    of writing on building up new weblog.
    https://www.sportstoto365.com

  • Hi there!You have made some decent points there. I just want to offer you a big thumbs up for the great info you have right here on this post. I am returning to your website for more soon.
    <a href="https://www.baccaratsite.win" target="_blank" title="온라인카지노사이트">온라인카지노사이트</a>

  • Interesting blog! Is your theme custom made or did you download it from somewhere? A design like yours with a few simple adjustments would really make my blog shine. Please let me know where you got your design. Many thanks
    <a href="https://www.bacarasite.info/" target="_blank" title="파워볼사이트닷컴">파워볼사이트닷컴</a>

  • Great post. I was checking continuously this blog and I am impressed!
    Extremely helpful info particularly the last part :) I care for such info
    a lot. I was seeking this particular information for
    a long time. Thank you and good luck.<a href="https://bamgosoo.com" rel="nofollow">오피</a><br>

  • You made such an interesting piece to read, giving every subject enlightenment for us to gain knowledge. Thanks for sharing the such information with us to read this. <a href="https://zerostate.io/">메이저놀이터</a>

  • I just want to mention I am very new to weblog and definitely savored you’re web-site. More than likely I’m planning to bookmark your site . You absolutely come with fabulous well written articles. With thanks for sharing with us your webpage. <a href="https://www.ufabet1688x.com/">ufabet1688</a>

  • This weblog is wonderful i love studying your articles. Stay up the good work! You realize, many people are looking around for this information, you can aid them greatly. <a href="https://www.g-club168.com/">จีคลับ</a>

  • Hello, I'm happy to see some great articles on your site. Would you like to come to my site later? My site also has posts, comments and communities similar to yours. Please visit and take a look <a href="https://envoytoken.io/">메이저놀이터</a>

  • Just desire tto say your article is as surprising.
    The clarity in your post is simply excellent and i could
    assume you’re an expert on this subject.
    Well with your permission allow me to grab your RSS feed to keep updated with forthcoming
    post. Thanks a million and please carry on the enjoyable work.
    <a href="https://bamgosoo.com" rel="nofollow">오피</a><br>
    Excellent way of describing, and good piece of writing to obtain data concerning my
    presentation subject, which i am going to convey in school.

  • I have been surfing online for more than three hours today, yet I never found any interesting article like yours. It’s pretty worth enough for me. Personally,

  • Wow, great blog layout! How long have you been blogging?
    Made blogging easy. The content as well as the overall look of the site is great!

  • Thanks for sharing great information. Your website is very nice. The details on this blog are very impressive.

  • Glad to chat your blog, I seem to be forward to more reliable articles and I think we all wish to thank so many good articles, blog to share with us.

  • Hello really awesome web site!! Guy .. Beautiful .. Wonderful .. I’ll bookmark your site and consider the feeds moreover. I am pleased to search out beneficial details appropriate here inside of the published material, thanks for sharing…

  • Your explanation is organized very easy to understand!!! I understood at once. Could you please post about <a href="https://mtboan.com/">사설토토</a> ?? Please!!

  • i like this blog very much its a ratting nice situation to

    click here<a href="https://egaon-casino.com">えがおんカジノ</a>

  • I read that Post and got it fine and informative. Please share more like that..
    <a href="https://www.sportstoto365.com" target="_blank" title="배트맨토토">배트맨토토</a>

  • I was recommended this blog by my cousin. I’m not sure whether this post is written by him as nobody else know such detailed about my difficulty. You’re wonderful! Thanks!
    <a href="https://www.sportstoto365.com" target="_blank" title="배트맨토토">배트맨토토</a>

  • It’s really a great and useful piece of information. I am glad that you shared this useful information with us. Please keep us up to date like this. Thanks for sharing.
    <a href="https://www.baccaratsite.win" target="_blank" title="온라인카지노사이트">온라인카지노사이트</a>

  • I was looking it for so long , and i found it finally that i know it will help me .
    <a href="https://www.bacarasite.info/" target="_blank" title="파워볼사이트닷컴">파워볼사이트닷컴</a>

  • We are really grateful for your blog post. You will find a lot of approaches after visiting your post. I was exactly searching for. Thanks for such post and please keep it up. Great work.

  • Great post. Thank you for giving these codes with examples.

  • Experts at Edumagnate comprehend the student's lifestyle and their willingness to learn. We have the most experienced and qualified professionals who are capable of producing plagiarism-free high-quality content. Our writing teams ensure that you will score the highest marks in the assignments. We promise content with zero numbers of grammatical errors. Our team is well-known for its authenticity, as we offer qualitative and genuine content before the deadline. With us, you get both quantity and quality at the same time.
    https://www.edumagnate.com/law-assignment-help.html

Add a Comment

As it will appear on the website

Not displayed

Your website