1

次のようなクエリ式の式ツリーを作成したいと思います: employee => employee.Salary.StartsWith("28")

そのため、SQL は次のように表示されます。 where (employee.salary like '28%')

問題は、従業員オブジェクトの Salary プロパティが小数であり、StartsWith が小数のプロパティではないことです。どうすればこれを行うことができますか。

私の誤った式ツリーの構文は次のとおりです。

var searchTextExp = Expression.Constant("28");
var parameterExp = Expression.Parameter(typeof(EmployeeEntity), "employee");
var propertyExp = Expression.Property(parameterExp, "Salary");
var startsWithExp = Expression.Call(propertyExp, "StartsWith", null, 
   searchTextExp);
Expression<Func<EmployeeEntity, bool>> searchExpr = 
   Expression.Lambda<Func<EmployeeEntity, bool>>
     (startsWithExp, new ParameterExpression[] { parameterExp });
4

3 に答える 3

1

LLBLGEN Pro の機能である関数マッピングを使用して、これを解決することができました。

public class Functions
{
    public static bool Like(string field, string value)
    {
        return true;
    }

    public static bool Like(decimal field, string value)
    {
        return true;
    }
}

public class FunctionMappings : FunctionMappingStore
{
    public FunctionMappings()
        : base()
    {
        FunctionMapping mapping = new FunctionMapping(
            typeof(Functions), 
            "Like", 
            2, 
            "{0} LIKE {1}");

        this.Add(mapping);
    }
}

次に、FunctionMappings のインスタンスを LINQ メタデータにアタッチしました。

metadata.Mappings = new FunctionMappings();

次に、関数を次のように使用しました。

employee => Functions.Like(employee.Salary,"28")
于 2010-09-14T18:47:24.487 に答える
1

最も簡単な解決策 (おそらく Linq to Sql でも機能する) は次のとおりです。

employee => employee.Salary.ToString().StartsWith("28");
于 2010-09-09T07:26:13.527 に答える
0

llblgen が ToString() をサポートしていない場合は、キャストを行うビューを作成することで問題を回避できます。ターゲット データベースは何ですか?

SQL Server の場合は、CAST() 関数を使用してビューを作成できます。

例えば

  CREATE VIEW viewName as 
    SELECT CAST(Salary as varchar) as Salary
    FROM Employee

その後、そのビューを新しいクラスにマップし、上記のようなクエリを実行できるはずです。

employee = employee.Salary.StartsWith("28");
于 2010-09-09T15:47:56.247 に答える