1

データベース内のエンティティを検索するために、次の一般的な方法を実行しようとしています:

    // 'atributo' is the name of the attribute to search against
    public List<TEntity> buscar<TEntity>(string valor, string atributo) where TEntity : class
    {
        var matches = from m in db.Set<TEntity>()
                      where m.GetType().GetProperty(atributo).GetValue(m, null).ToString().Contains(valor)
                      select m;

        return matches.ToList();
    }

もちろん、私は例外を取得しています:

LINQ to Entities がメソッド 'System.String ToString()' メソッドを認識しない

また、GetType()、GetProperty()、および GetValue() も無効な LINQ メソッドであることを知っています。

クエリの前に無効なメソッドを使用する方法がわかりません。

何か案は?

ティア

4

3 に答える 3

4

式ツリーを自分で書くこともできます (動的 LINQ は必要以上です)。

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;

class YourClass
{
    public static List<TEntity> DoSomething<TEntity>(DbContext db, string valor, string atributo)
        where TEntity : class
    {
        var mParam = Expression.Parameter(typeof(TEntity));

        var matches = db.Set<TEntity>()
                        .Where(Expression.Lambda<Func<TEntity, bool>>(
                            Expression.Call(
                                Expression.Convert(
                                    Expression.Property(mParam, atributo),
                                    typeof(String)
                                    ),
                                "Contains",
                                new Type[0],
                                Expression.Constant(valor)
                                ),
                            mParam
                         ));

        return matches.ToList();
    }
}

ノート:

  1. プロパティが TEntity で定義されていない場合は機能しません (TEntity が抽象で、すべてのサブクラスプロパティを定義している場合でも)。
  2. プロパティの戻り値の型が であることがわかっている場合は、呼び出しStringを避けることができます。Expression.Convert
  3. Entity Framework がプロパティの値を文字列に変換できない場合 (たとえば、プロパティがエンティティ型を返す場合)、これは機能しません。
于 2013-01-30T08:23:11.183 に答える
0

linq to entities は、linq を式ツリーに変換してから、その式ツリーを SQL に変換しようとします。式を評価しないため、リフレクション コードを SQL に変換できません。あなたができることは、動的linqを使用することです。コードは次のようになります

public List<TEntity> buscar<TEntity>(string valor, string atributo) where TEntity : class
{
    return db.Set<TEntity>()
           .Where(atributo + =".Contains(\"" + valor + "\")")
           .ToList()
}
于 2013-01-30T07:52:57.340 に答える
-1

アップデート:

SqlFunctions.StringConvert(m.GetType().GetProperty(atributo).GetValue(m, null))
于 2013-01-30T07:23:32.890 に答える