Skip to content

interface 型のオブジェクトで、継承した interface に定義している プロパティ を ToSqlObject、TwoWaySql に使うと例外が出る #9

Description

@OdaShinsuke

version
LambidcSql:0.69.0
LambdicSql.SqlServer:0.29.0

.NET Framework、.NET Core でも同様。

再現コード

using LambdicSql;
using System;
using System.Data.SqlClient;
using System.Diagnostics;
using static LambdicSql.SqlServer.Symbol;

namespace LambdicSqlTest
{
    public interface ICond
    {
        long Id { get; }
    }
    public interface ICondWithPaging : ICond
    {
        int PageSize { get; }
    }
    public class CondWithPaging : ICondWithPaging
    {
        public long Id { get; set; }
        public int PageSize { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test1(new CondWithPaging { Id = 100, PageSize = 100 });
            Test2(new CondWithPaging { Id = 100, PageSize = 100 });
            Console.ReadKey();
        }

        static void Test1(ICond cond)
        {
            var where = Db<DB>.Sql(_ =>
                ((bool)("Status = 1").ToSqlObject()) &&
                new Condition(true, @"Table1.Id = {0}".ToSqlObject(cond.Id)));
            var sql = Db<DB>.Sql(_ => @"select * from Table1
/*0*/where Id = -1/**/
order by Id".TwoWaySql(Where(where)));

            var buildedSql = sql.Build(typeof(SqlConnection));
            var text = buildedSql.Text;
            var ps = buildedSql.GetParams();

            Debug.WriteLine(text);
            foreach (var p in ps)
            {
                Debug.WriteLine($"name:{p.Key} values:{p.Value.Value}");
            }
        }
        static void Test2(ICondWithPaging cond /*CondWithPaging だと例外でない*/)
        {
            // throw exception 
            // {"Id' は型 'LambdicSqlTest.ICondWithPaging' のメンバーではありません"}	System.ArgumentException
            var where = Db<DB>.Sql(_ =>
                ((bool)("Status = 1").ToSqlObject()) &&
                new Condition(true, @"Table1.Id = {0}".ToSqlObject(cond.Id)));
            var sql = Db<DB>.Sql(_ => @"select * from Table1
/*0*/where Id = -1/**/
order by Id".TwoWaySql(Where(where)));

            var buildedSql = sql.Build(typeof(SqlConnection));
            var text = buildedSql.Text;
            var ps = buildedSql.GetParams();

            Debug.WriteLine(text);
            foreach (var p in ps)
            {
                Debug.WriteLine($"name:{p.Key} values:{p.Value.Value}");
            }
        }
    }
}

Stacktrace

   場所 System.Linq.Expressions.Expression.PropertyOrField(Expression expression, String propertyOrFieldName)
   場所 LambdicSql.ConverterServices.Inside.ExpressionToObject.GetMemberObject(MemberExpression exp)
   場所 LambdicSql.ConverterServices.Inside.ExpressionToObject.GetExpressionObjectCore(Expression exp, Object& obj)
   場所 LambdicSql.ConverterServices.Inside.ExpressionToObject.GetExpressionObject(Expression exp, Object& obj)
   場所 LambdicSql.ConverterServices.ExpressionConverter.ResolveExpressionObject(Expression exp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(MemberExpression member)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(Expression exp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(UnaryExpression unary)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(Expression exp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.ConvertToCode(Object obj)
   場所 LambdicSql.Specialized.SymbolConverters.ToSqlConverterAttribute.<>c__DisplayClass0_0.<Convert>b__0(Expression e)
   場所 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   場所 System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   場所 System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   場所 LambdicSql.Specialized.SymbolConverters.ToSqlConverterAttribute.Convert(MethodCallExpression expression, ExpressionConverter converter)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(MethodCallExpression method)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(Expression exp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.ConvertToCode(Object obj)
   場所 LambdicSql.Specialized.SymbolConverters.ConditionConverterAttribute.Convert(NewExpression expression, ExpressionConverter converter)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(NewExpression newExp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(Expression exp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(UnaryExpression unary)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(Expression exp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(BinaryExpression binary)
   場所 LambdicSql.ConverterServices.ExpressionConverter.Convert(Expression exp)
   場所 LambdicSql.ConverterServices.ExpressionConverter.ConvertToCode(Object obj)
   場所 LambdicSql.ConverterServices.ExpressionConverter.CreateCode(DbInfo dbInfo, Expression core)
   場所 LambdicSql.Db`1.Sql[TResult](Expression`1 expression)
   場所 LambdicSqlTest.Program.Test2(ICondWithPaging cond) (C:\Users\shinsuke-oda\source\repos\LambdicSqlTest\LambdicSqlTest\Program.cs):行 56
   場所 LambdicSqlTest.Program.Main(String[] args) (C:\Users\shinsuke-oda\source\repos\LambdicSqlTest\LambdicSqlTest\Program.cs):行 31

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions