2010-12-09 19 views
0
 

var query = (from u in results 
      select u).AsQueryable(); 


//Build where clause 
if (!string.IsNullOrEmpty(userRequest.searchData)) 
{ 
    if (userRequest.searchBy == "LastName") 
    { 
     var likestr = userRequest.searchData.Trim(); 
     query = (from n in query where n.StartsWith(likestr) select n).AsQueryable(); 

    } 
    if (userRequest.searchBy == "FirstName") 
    { 

    } 
    if (userRequest.searchBy == "Email") 
    { 
     //var likestr = string.Format("%{0}%", userRequest.searchData.Trim()); 

    } 
    if (userRequest.searchBy == "UserId") 
    { 
     query = query.Where(x => SqlMethods.Equals(x.UserId, Convert.ToInt32(userRequest.searchData))); 
    } 
} 

Zuerst Abfrage ich die DB und in var Abfrage speichern.ASP.NET Dynamische Linq-Suche

Dann, wenn es Suchdaten gibt, versuche ich, die Where-Klausel mit 1 oder 4 möglichen Suchen zu heften.

Hilfe?

Antwort

0

würde ich .Contains stattdessen verwenden.

+0

Er wollte nur die Namen mit dem Uservalue beginnen. – Christian

0

Versuchen Sie nicht, SQL-Verhalten mit Linq zu imitieren. Sie haben eine Liste und können diese Liste basierend auf Objektmethoden abfragen.

Versuchen Sie stattdessen:

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

namespace Test1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable table = new DataTable(); 
      table.Columns.Add("ID", typeof(int)); 
      table.Columns.Add("FIRSTNAME", typeof(string)); 
      table.Columns.Add("LASTNAME", typeof(string)); 
      table.Columns.Add("EMAIL", typeof(string)); 

      // Here we add five DataRows. 
      table.Rows.Add(1, "Chris", "Foo", "[email protected]"); 
      table.Rows.Add(2, "Christoph", "Bar", "[email protected]"); 
      table.Rows.Add(3, "Michael", "FooBar", "[email protected]"); 
      table.Rows.Add(4, "Andreas", "BarFoo", "[email protected]"); 
      table.Rows.Add(5, "Carl", "Bar", "[email protected]"); 

      Console.WriteLine("//Query ID"); 
      var query1 = (from dr in table.AsEnumerable() where dr.Field<int>("ID") == 1 select dr).FirstOrDefault(); 

      Console.WriteLine(query1.Field<int>("ID")); 

      Console.WriteLine("//Query Firstname"); 
      var query2 = (from dr in table.AsEnumerable() where dr.Field<string>("FIRSTNAME").StartsWith("C") select dr).ToList<System.Data.DataRow>(); 

      foreach (var q in query2) 
      { 
       Console.WriteLine(q.Field<int>("ID")); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

Ausgang:

//Query ID 
1 
//Query Firstname 
1 
2 
5 
+0

Ich habe meine Frage bearbeitet, also schaut es euch an. – Mark

+0

Ich habe meine Antwort mit einem vollständigeren Beispiel bearbeitet. Du solltest die Linie bekommen. Verwenden Sie immer die Standardmethoden, keine SQL-Methoden. Also für E-Mail in Ihrem obigen Beispiel. Enthält, .equals, wo Sie Objekte vergleichen, startswith und so weiter. Und das Ergebnis einer Abfrage ist übrigens abfragbar, also keine Transformation nötig. – Christian

+0

sehr schön, wie ist die Orderby-Klausel? – Mark

0

einfach auf die Abfrage hinzufügen, wie Sie benötigen. Sie können mehrere where-Klauseln darauf ketten und sie werden nacheinander ausgeführt.

var query = (from u in results select u); 

if (!string.IsNullOrEmpty(userRequest.searchData)) 
{ 
    if (userRequest.searchBy == "LastName") 
    { 
     var likestr = userRequest.searchData.Trim(); 
     query = (from n in query where n.LastName.StartsWith(likestr) select n); 
    } 
    if (userRequest.searchBy == "UserId") 
    { 
     var userId = Convert.ToInt32(userRequest.searchData); 
     query = (from n in query where n.UserId == userId select n); 
    } 

etc

Verwandte Themen