Frage

Nicht sicher, ob dies möglich ist, oder wenn ich zum Ausdruck richtig, was ich suche, aber ich habe das folgende Stück Code in meiner Bibliothek immer wieder und möchte einige DRY üben. Ich habe von SQL Server-Tabellen festgelegt, dass ich die Abfrage basiert auf einem einfachen Benutzer gelieferten Suchfeld ala Google. Ich bin mit LINQ der endgültigen Abfrage zu komponieren, basierend auf, was in dem Such-String. Ich bin nach einer Möglichkeit, Generika zu verwenden und in Lambda-Funktionen übergeben, eine wiederverwendbare Routine aus diesem zu erstellen:

string[] arrayOfQueryTerms = getsTheArray();

var somequery = from q in dataContext.MyTable
                select q;

if (arrayOfQueryTerms.Length == 1)
{
    somequery = somequery.Where<MyTableEntity>(
        e => e.FieldName.StartsWith(arrayOfQueryTerms[0]));
}
else
{
    foreach(string queryTerm in arrayOfQueryTerms)
    {
        if (!String.IsNullOrEmpty(queryTerm))
        {
            somequery = somequery 
                        .Where<MyTableEntity>(
                            e => e.FieldName.Contains(queryTerm));
        }
    }
}

Ich habe gehofft, eine generische Methode mit der Signatur zu erstellen, die so etwas wie folgt aussieht:

private IQueryable<T> getQuery(
    T MyTableEntity, string[] arrayOfQueryTerms, Func<T, bool> predicate)

Ich bin mit der gleichen Suchstrategie über all meine Tabellen, so dass die einzige Sache, die aus der Nutzung zu Nutzung unterscheidet sich wirklich die MyTable & MyTableEntity gesucht und der Feldname gesucht. Macht das Sinn? Gibt es eine Möglichkeit mit LINQ to dynamisch im Namen des Feldes passiert in der where-Klausel abzufragen? Oder kann ich in diese passieren als Prädikat Lambda?

e => e.FieldName.Contains(queryTerm)

Ich weiß, es gibt eine und eine halbe Million Möglichkeiten, dies in SQL zu tun, wahrscheinlich einfacher, aber ich würde gerne alles in der LINQ-Familie für diese zu halten. Auch glaube ich, dass Generika für ein Problem, wie diese praktisch sein sollte. Irgendwelche Ideen?

War es hilfreich?

Lösung

Es klingt wie Sie für die dynamische Linq suchen. Werfen Sie einen Blick hier . Auf diese Weise können Sie Zeichenfolgen als Argumente an die Abfragemethoden zu übergeben, wie:

var query = dataSource.Where("CategoryID == 2 && UnitPrice > 3")
                      .OrderBy("SupplierID");

Edit: Ein anderer Satz Beiträge zu diesem Thema, C # 4 Dynamic Support mit: Teil 1 und Teil 2 .

Andere Tipps

Was es klingt ist es, Sie wollen im Grunde ein bedingter Prädikat Builder ..

Ich hoffe, dass Sie diese in etwas formen können Sie, viel Glück suchen!

http://www.albahari.com/nutshell/predicatebuilder.aspx

Sie könnten Ausdruck Bäume aussehen wollen:

IQueryable<T> getQuery<T>(T myTableEntity, string[] arrayOfQueryTerms, Expression<Func<T, bool>> predicate)
 { var fieldOrProperty = getMemberInfo(predicate);
   /* ... */
 }

MemberInfo getmemberInfo<T>(Expression<Func<T,bool> expr)
 { var memberExpr = expr as MemberExpression;
   if (memberExpr != null) return memberExpr.Member;
   throw new ArgumentException();
 }

var q = getQuery<FooTable>(foo, new[]{"Bar","Baz"}, x=>x.FieldName);

Vor kurzem hatte ich das gleiche zu tun. Sie müssen Dynamische Linq < a href = "http://talesfromthebleedingedge.blogspot.com/2008/10/linq-to-entities-dynamic-linq-to.html" rel = "nofollow noreferrer"> hier ist ein Weg, dies zu halten stark typisiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top