C# Linq列表包含方法
Im新手到linq,Im使用linq查询从表中检索数据。我的想法是列出与特定用户对应的所有现金保险柜,并在dropdownlist中显示 表结构如下所示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
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中,值不太可能不是数字,如果是数字,我们不应该只是默默地处理损坏的数据。它可能会导致更严重的数据损坏,以确保其正常工作。您提供的条件以整数表示。