Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq列表包含方法_C#_Linq - Fatal编程技术网

C# Linq列表包含方法

C# Linq列表包含方法,c#,linq,C#,Linq,Im新手到linq,Im使用linq查询从表中检索数据。我的想法是列出与特定用户对应的所有现金保险柜,并在dropdownlist中显示 表结构如下所示 Table 1 cashsafeid cashsafename 1 cashsafe1 2 cashsafe2 3 cashsafe3 Table 2 Id UserId Cashsafeid 1 100 1,2,3 2 101

Im新手到linq,Im使用linq查询从表中检索数据。我的想法是列出与特定用户对应的所有现金保险柜,并在dropdownlist中显示

表结构如下所示

Table 1
cashsafeid  cashsafename
  1           cashsafe1
  2           cashsafe2
  3           cashsafe3

Table 2
 Id   UserId   Cashsafeid 
  1    100      1,2,3
  2    101      1,3
我必须得到一个特定用户的cashsafename,比如说100。我怎样才能做到呢 下面的代码是我尝试过的代码,但被卡住了

 List<Cashsafe> cashsafes=(from c in db.Table 1
                              where c.CashsafeId contains() )--Cannot go further
List cashsafes=(来自数据库中的c.表1
其中c.CashsafeId包含())--无法进一步

您以非常低效的方式存储用户的Cachsafeid列-它不允许为LINQ提供程序生成高效的SQL。因此,以下解决方案的性能很差—如果您关心这一点的话—请更改您的表结构

var user = db.Table2.Single(u => u.UserId == 100);
var cachfeIds = user.Cashsafeid.Split(',').Select(int.Parse).ToArray();
var cachefes = db.Table1.Where(c => cachfeIds.Contains(c.Id)).ToList();

基本上,您需要连接到表,但外键是“虚拟的”——它只存在于您的头脑中。要检索外键值,我们必须拆分每个用户的Cachsafeid列的值以检索链接的缓存。然后才使用单独的请求检索缓存(我认为LINQ将从表和C#代码中的execute Where部分检索所有值)。

您以非常低效的方式存储用户的Cachsafeid列-它不允许为LINQ提供程序生成高效的SQL。因此,以下解决方案的性能很差—如果您关心这一点的话—请更改您的表结构

var user = db.Table2.Single(u => u.UserId == 100);
var cachfeIds = user.Cashsafeid.Split(',').Select(int.Parse).ToArray();
var cachefes = db.Table1.Where(c => cachfeIds.Contains(c.Id)).ToList();

基本上,您需要连接到表,但外键是“虚拟的”——它只存在于您的头脑中。要检索外键值,我们必须拆分每个用户的Cachsafeid列的值以检索链接的缓存。然后才使用单独的请求检索cachefes(我认为LINQ将从表和C#code中的executewhere部分检索所有值)。

如果您不知道join,可以使用

 int x = 0;
                List<int> Users = db.table2.FirstOrDefault(m => m.UserId == 100).Cashsafeid.Split(',').ToList().Where(str => int.TryParse(str, out x)).Select(str => x).ToList(); ;
                var content = db.table1.Where(m => Users.Contains(m.cashsafeid)).ToList();
intx=0;
List Users=db.table2.FirstOrDefault(m=>m.UserId==100).Cashsafeid.Split(',').ToList().Where(str=>int.TryParse(str,out x)).Select(str=>x.ToList();
var content=db.table1.Where(m=>Users.Contains(m.cashsafeid)).ToList();

如果您不想加入,可以使用

 int x = 0;
                List<int> Users = db.table2.FirstOrDefault(m => m.UserId == 100).Cashsafeid.Split(',').ToList().Where(str => int.TryParse(str, out x)).Select(str => x).ToList(); ;
                var content = db.table1.Where(m => Users.Contains(m.cashsafeid)).ToList();
intx=0;
List Users=db.table2.FirstOrDefault(m=>m.UserId==100).Cashsafeid.Split(',').ToList().Where(str=>int.TryParse(str,out x)).Select(str=>x.ToList();
var content=db.table1.Where(m=>Users.Contains(m.cashsafeid)).ToList();


更准确地说,OP需要在
where
之后制定一个条件,其中当前只有一个成员被取消引用。请仔细阅读问题我有两个表,我想列出属于特定用户(表2)的所有cashsafename(表1)@SparAby,谢谢,我已经意识到我错了。固定答案我再次同意@GrantWinneyFixed答案。很抱歉发布未经测试的解决方案-我没有您的Db实体。现在使用Linq对对象进行测试。应该有效。更准确地说,OP需要在
where
之后制定一个条件,其中当前只有一个成员被取消引用。请仔细阅读问题我有两个表,我想列出属于特定用户(表2)的所有cashsafename(表1)@SparAby,谢谢,我已经意识到我错了。固定答案我再次同意@GrantWinneyFixed答案。很抱歉发布未经测试的解决方案-我没有您的Db实体。现在使用Linq对对象进行测试。应该可以。我认为您需要首先修复您的表,以便能够得到您想要的。您应该真正重新考虑您的数据库设计。尝试(在本例中,一定要尝试)避免使用逗号分隔的列。尝试进一步规范化。我建议您创建另一个表来映射两个表之间的关系。由于表的关系是1对多,因此每行将包含1个userdid和1个cashsafeid。这样做将使您更容易加入表。我认为您需要首先修复表,以便能够获得所需的内容。您应该重新考虑数据库设计。尝试(在本例中,一定要尝试)避免使用逗号分隔的列。尝试进一步规范化。我建议您创建另一个表来映射两个表之间的关系。由于表的关系是1对多,因此每行将包含1个userdid和1个cashsafeid。这样做将使您更容易加入表。这里我得到一条消息,您无法在第一个linq查询中将字符串转换为int,因为它正在工作,但它太不明显了!您可以删除TryParse部分—在他的DB中,值不太可能不是数字,如果是数字,我们不应该只是默默地处理损坏的数据。它可能会导致更严重的数据损坏,以确保其正常工作。您提供的条件是int。这里我收到一条消息,您无法在第一个linq查询中将字符串转换为int,因为它正在工作,但它非常不明显!您可以删除TryParse部分—在他的DB中,值不太可能不是数字,如果是数字,我们不应该只是默默地处理损坏的数据。它可能会导致更严重的数据损坏,以确保其正常工作。您提供的条件以整数表示。