簡體   English   中英

C# 使用 linq 查詢過濾數組中的值

[英]C# Using a linq query to filter on Values in an Array

我正在努力處理這個查詢數據庫的Linq查詢。

var roles = _context.Schools
                    .Select(x =>
                            new SelectListItem
                            {
                                Value = x.SchoolId.ToString(),
                                Text = x.SchoolNamePostCode
                            });

我的查詢當前將 Schools 的整行放入SelectListItem中。 但是,我要做的是添加一個 Where 子句,其中包含一個字符串值 ID 數組。

string[] AssociatedSchoolsArray = AssociatedSchoolIDs.Split(",");

變量AssociatedSchoolsArray包含一個數組,例如"1","3"

所以在我原來的Linq查詢中,我只想過濾SchoolIds 13SelectListItem

我怎樣才能做到這一點?

非常感謝

您可以使用 where ,例如;

   var roles = _context.Schools
                .Where(c=>c.SchoolId == 1 || c.schoolId == 3)
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        });

或者當然也在之后;

   var roles = _context.Schools
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        })
                .Where(c=>c.Value == "1" || c.Value == "3");

基於值列表:

   var searchWords = new List<string>(new [] { "1", "2"});
   var roles = _context.Schools
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        })
                .Where(c=>searchWords.Contains(c.Value));

筆記; 而不是 contains 你也可以使用.Any() 那個更靈活,因為它需要一個委托,但由於.Contains()是集合 object 固有的方法,它可能會更快。 就 EF 和 linq 到 sql 而言,它們都被轉換為 SQL 查詢,所以我懷疑它是否重要。

.Contains方法將生成... WHERE column IN (1, 2, 3) sql 查詢

猜測SchoolId的類型是int ,因此您需要先將字符串 id 解析為 integer。

var selectedIds = Array.ConvertAll(AssociatedSchoolIDs.Split(","), int.Parse);

var items = _context.Schools
    .Where(school => selectedIds.Contains(school.SchoolId))
    .Select(school => new SelectListItem
        {
            Value = x.SchoolId,
            Text = x.SchoolNamePostCode
        })
    .ToArray();

似乎 SchoolId 在數據庫中存儲為 int ,因此您應該在 where 語句之前先轉換為 int 以加快性能。

int[] AssociatedSchoolsArray = AssociatedSchoolIDs.Split(",").Select(item => Int32.Parse(item).ToArray();
var roles = _context.Schools.Where(item => AssociatedSchoolsArray.Contains(item.SchoolId))
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        });

除了其他很好的答案之外,這是一種使用 LINQ 查詢語法的方法:

var AssociatedSchoolIDs = "1,3";

var selectedIds = AssociatedSchoolIDs
    .Split(",")
    .Select(x => int.Parse(x));

var roles = (from school
             in _context.Schools
             where selectedIds.Contains(school.SchoolId)
             select new SelectListItem
             {
                 Value = school.SchoolId,
                 Text = school.SchoolNamePostCode
             }).ToArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM