Entity Framework 包含整数数组

Entity Framework Contains Integer Array

public void GetMuscles(List<ListItem> selected)
 {
     int[] arrayOfStrings = new int[selected.Count];

     for (int i = 0; i < selected.Count; i++)
     {
         arrayOfStrings[i] = Convert.ToInt32(selected[i].Value);
     }  
}  

using (var db = new DWSEntities())
{
     var muscles = (from m in db.Muscles
         where m.MainMusleGroupID. //ISSUE
         select new { m.MusleName, m.ID }).Take(40);
}

我需要在 where 语句中使用 contains 但在“.”之后我没有使用包含的选项。我用非整数值尝试了同样的方法,它出现了。我有一个整数数组,需要 WHERE IN 子句。那么有没有其他方法可以在没有包含的情况下做到这一点,或者我如何使用包含整数值?

我的评论

Sql WHERE... IN 在 Linq 中被反转,即

 where MyIntArray.Contains(m.MainMusleGroupID)

或 lambda 语法

db.Muscles.Where(m => MyIntArray.Contains(m.MainMusleGroupID)

回复:int[] 不包含 'Contains

的定义

在 class 的顶部,确保您拥有:

 using System.Linq;

(以及下面的评论) 确保 Contains 中使用的实体字段的类型与被比较的集合的类型相匹配,即 MainMusleGroupID 本身必须是整数,以便与 arrayOfInts.Contains() 一起使用。

回复:重构

命名约定 arrayOfStrings 表示整数数组(或者实际上,其他数字类型,例如 long)将导致可维护性问题。

您可以使用 LINQ 简化 arrayOfX[] 数组的创建:(请注意,在 for 循环和 using 之间有一个额外的 }

var arrayOfLongs = selected.Select(s => Convert.ToInt64(s.Value)).ToArray();

结果

var muscles = (from m in db.Muscles
    where arrayOfLongs.Contains(m.MainMusleGroupID)
    select new { m.MusleName, m.ID }).Take(40);

或者在 Lambda 语法中:

var musclesLambda = db.Muscles
    .Where(m => arrayOfLongs.Contains(m.MainMusleGroupID))
    .Select(m => new { m.MusleName, m.ID })
    .Take(40);

(我更改了数组的名称以匹配类型)

我找到了解决方案。我刚刚在这里添加了 (int):

m => arrayOfInts.Contains((int)m.MainMusleGroupID) 

下面是工作代码:

var arrayOfInts = selected.Select(s => Convert.ToInt32(s.Value)).ToArray();
            using (var db = new DWSEntities())
            {
                var muscles = db.Muscles.Where(m => arrayOfInts.Contains((int)m.MainMusleGroupID))
                                        .Select(m => new { m.MusleName, m.ID }).Take(40);



                cblMusle.DataSource = muscles.ToList();
                cblMusle.DataTextField = "MusleName";
                cblMainMuscle.DataValueField = "ID";
                cblMusle.DataBind();
            }