【问题标题】:Entity Framework Contains Integer Array实体框架包含整数数组
【发布时间】:2015-08-10 23:35:10
【问题描述】:
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 子句。那么有没有其他方法可以在没有包含的情况下执行此操作,或者如何将包含与整数值一起使用?

【问题讨论】:

  • In 是倒置的,即 where MyIntArray.Contains(m.MainMusleGroupID)(在 lambda 中是 db.Muscles.Where(m =&gt; MyIntArray.Contains(m.MainMusleGroupID).Select ...
  • 我也试过了,但我得到另一个错误,比如“int []不包含'包含'的定义和最佳扩展重载......”
  • 检查您的 .cs 代码文件顶部是否有 using System.Linq;

标签: .net arrays entity-framework select contains


【解决方案1】:

我的评论

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

 where MyIntArray.Contains(m.MainMusleGroupID)

或在 lambda 语法中

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

Re : int[] 不包含“包含”的定义

确保你在课堂上名列前茅:

 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 []不包含'包含'的定义和最好的扩展重载......” :(我认为它只适用于字符串值。因为如果我使用字符串值它就可以工作.
  • 好的,我认为 this 可能是问题 - MainMusleGroupID 可能不是 int - 可能您已经进行了一些模型更改(例如更改为 Enum)或者可能是它Guid、Varchar 或其他类型。 arrayOfStrings 的类型需要相应调整。
  • hmmmm,那可能是……我会再检查并回答你。
  • 不幸的是:(数据库和模型没有问题。它的整数值。我什至重新创建了模型,仍然是同样的错误。
  • 它使用了一个额外的 '(int)' m => arrayOfInts.Contains((int)m.MainMusleGroupID)
【解决方案2】:

我找到了解决方案。只是我在这里添加了(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();
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多