“ หรือ” เทียบเท่าใน Linq Where () นิพจน์แลมด้า


92

มีเมธอดใน Linq ที่คุณสามารถใช้สร้างสตริง SQL เช่น "... where (a = 1) OR (a = 2)" ได้หรือไม่?


5
ผมถือว่าคุณรู้วิธีการใช้และต้องการบางสิ่งบางอย่างแบบไดนามิกเช่น|| a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);คุณอาจต้องการระบุให้ชัดเจนยิ่งขึ้น ...
Kobi

คำตอบ:


191

คุณสามารถทำได้อย่างแน่นอนภายในประโยค Where (วิธีการขยาย) หากคุณจำเป็นต้องสร้างแบบสอบถามที่ซับซ้อนแบบไดนามิกแม้ว่าคุณสามารถใช้PredicateBuilder

 var query = collection.Where( c => c.A == 1 || c.B == 2 );

หรือใช้ PredicateBuilder

 var predicate = PredicateBuilder.False<Foo>();
 predicate = predicate.Or( f => f.A == 1 );
 if (allowB)
 {
    predicate = predicate.Or( f => f.B == 1 );
 }

 var query = collection.Where( predicate );

สิ่งนี้ใช้งานได้ดีเมื่อฉันต้องการสร้างหรือขึ้นอยู่กับค่าของพารามิเตอร์ขาเข้า - ยอดเยี่ยม!
Mark

เจ๋งมาก. มันน่าเสียดายที่สิ่งนี้ไม่ได้รวมอยู่ในฟังก์ชันภายใน. NET เป็นมาตรฐาน
maxp

1
การใช้งานที่ดีมากแม้ว่าอาจไม่ได้ระบุไว้ว่าใช้ได้กับ C # 5+ เท่านั้น
Thomas.Donnelly

25

คุณสามารถใช้ตัวดำเนินการบูลีน. NET มาตรฐานใน single ของคุณโดยที่ clause:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b')

19

คุณใช้ตัวดำเนินการเดียวกันกับใน C # ===> || ปกติ สำหรับ "หรือ" && สำหรับ "และ" เป็นต้น

var something = from s in mycollection
                where s.something == 32 || 
                      s.somethingelse == 45 
                select s

1

ในการ.Where()โทรของคุณให้ใช้ตัวดำเนินการบูลีน 'หรือ' ||มาตรฐาน

var query = items.Where(item => (item == 1 || item == 2));

ทั้งหมด Where call ทำคือการเปรียบเทียบบูลีนกับสิ่งที่คุณต้องการดังนั้นคุณสามารถเติมตรรกะเงื่อนไขได้มากเท่าที่คุณต้องการ


0

หากคุณไม่ทราบจำนวนพารามิเตอร์คุณสามารถใช้สิ่งนี้:

ข้อมูลตัวอย่าง

var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

รหัส

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();

-1

ตอนนี้อยู่ใน. net แล้วไม่แน่ใจว่าก่อนหน้านี้ไม่ใช่หรือเปล่า ด้วยการสืบค้น Linq ที่มีอยู่คุณสามารถเพิ่ม where clause ที่รับอาร์เรย์ของสตริง (SearchStrings) และตรวจสอบว่าสิ่งใดตรงกับวัตถุใด ๆ ในคอลเล็กชันที่คุณกำลังค้นหาหรือไม่ การใช้ ToLower () ทำให้แน่ใจว่าคุณหลีกเลี่ยงความไวของตัวพิมพ์เล็กและใหญ่ในการสืบค้น SQL

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower()));

คุณสามารถทำสิ่งเดียวกันสำหรับเพรดิเคต 'และ' โดยจับคู่คำทั้งหมดในอาร์เรย์กับออบเจ็กต์ของคอลเลกชัน

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower()));

ในตัวอย่างนี้ฉันสัมพันธ์กับแต่ละอ็อบเจ็กต์ในคอลเลกชันและ s สัมพันธ์กับแต่ละสตริงในอาร์เรย์ SearchStrings


1
โปรดทราบว่าผู้ให้บริการ EF ไม่สามารถแปลคำว่า "Any" ได้และจะได้รับการประเมินในเครื่องส่งผลให้เกิดการสแกนแบบเต็มตารางและการกรองในหน่วยความจำ
Wade Bee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.