0
public List<DbSet> Get(String q = null)
{
    List<DbSet> objs = new List<DbSet>();

    if (!string.IsNullOrEmpty(q) && q != "undefined")
    {
        objs = from dealer in db.Dealers
               where dealer.Contains
               ......(?????)
    }
}

私の dbcontext クラスには 4 つの DbSet があります。このような検索を実行できます

objs = from dealer in db.Dealers
       where dealer.Name.Contains(q)

ただし、名前だけでなく、ディーラーのすべてのフィールドに対して検索を行うことを除いて、同様のことができるようにしたいと考えています。すべてのフィールドは文字列です

編集

わかりましたので、これは私が達成しようとしていることを行うための最良の方法ではないと考え始めています。「全文検索」というものを調べています。誰かがエンティティでこれがどのように機能するかを説明するか、適切なリソースへのリンクを教えてもらえますか

4

3 に答える 3

2

linq 拡張メソッドを作成できます。

私のブログ投稿をチェックしてください。
http://jnye.co/Posts/7/generic-iqueryable-or-search-on-multiple-properties-using-expression-trees

(クラスは github にもあります: https://github.com/ninjanye/SearchExtensions )

public static IQueryable<T> Search<T>(this IQueryable<T> source, string searchTerm, params Expression<Func<T, string>>[] stringProperties)  
{  
    if (String.IsNullOrEmpty(searchTerm))  
    {  
        return source;  
    }  

    var searchTermExpression = Expression.Constant(searchTerm);  

    //Variable to hold merged 'OR' expression  
    Expression orExpression = null;  
    //Retrieve first parameter to use accross all expressions  
    var singleParameter = stringProperties[0].Parameters.Single();  

    //Build a contains expression for each property  
    foreach (var stringProperty in stringProperties)  
    {  
        //Syncronise single parameter accross each property  
        var swappedParamExpression = SwapExpressionVisitor.Swap(stringProperty, stringProperty.Parameters.Single(), singleParameter);  

        //Build expression to represent x.[propertyX].Contains(searchTerm)  
        var containsExpression = BuildContainsExpression(swappedParamExpression, searchTermExpression);  

        orExpression = BuildOrExpression(orExpression, containsExpression);  
    }  

    var completeExpression = Expression.Lambda<Func<T, bool>>(orExpression, singleParameter);  
    return source.Where(completeExpression);  
}  

private static Expression BuildOrExpression(Expression existingExpression, Expression expressionToAdd)  
{  
    if (existingExpression == null)  
    {  
        return expressionToAdd;  
    }  

    //Build 'OR' expression for each property  
    return Expression.OrElse(existingExpression, expressionToAdd);  
}  

private static MethodCallExpression BuildContainsExpression<T>(Expression<Func<T, string>> stringProperty, ConstantExpression searchTermExpression)  
{  
    return Expression.Call(stringProperty.Body, typeof(string).GetMethod("Contains"), searchTermExpression);  
}  

次のクラスも必要になります。

//Create SwapVisitor to merge the parameters from each property expression into one  
public class SwapVisitor : ExpressionVisitor  
{  
    private readonly Expression from, to;  
    public SwapVisitor(Expression from, Expression to)  
    {  
        this.from = from;  
        this.to = to;  
    }  
    public override Expression Visit(Expression node)  
    {  
        return node == from ? to : base.Visit(node);  
    }  
    public static Expression Swap(Expression body, Expression from, Expression to)  
    {  
        return new SwapVisitor(from, to).Visit(body);  
    }  
}  

次に、次のように記述できます。

db.Dealers.Search(q, x => x.Field1,    
                     x => x.Field2, 
                     ...  
                     x => x.Field20)
于 2013-07-01T16:05:31.750 に答える
1

申し訳ありませんが、ここにショートカットはありません:

objs = from dealer in db.Dealers
       where dealer.Name.Contains(q) || 
             dealer.Field2.Contains(q) ||
             ...
             dealer.Field20.Contains(q)
       select dealer;

値を検索するフィールドを指定する必要があります。

于 2013-07-01T15:59:30.063 に答える
0

すべてのフィールドの条件を手動で記述できます。

objs = from dealer in db.Dealers
       where dealer.Name.Contains(q) ||
             dealer.Foo.Contains(q) ||  
             // etc
             dealer.Bar.Contains(q)
       select dealer;

エンティティのすべてのプロパティを何らかの条件でチェックするように Entity Framework に指示する簡単な方法はありません。

于 2013-07-01T15:59:01.263 に答える