根据 LINQ 中的 Where 条件使少数列为 NULL
本文关键字:数列 NULL 条件 LINQ 中的 Where 根据 | 更新日期: 2024-11-08 23:50:45
我正在开发一个 C# 应用程序,其中我从 SQL 数据返回整个数据,其中某些条件可以使用以下数据进行解释
表1
Id Term Location Bvol Buser Bid Offer Ovol Ouser
1 Q1 Hou 100 dev 10 20 200 john
2 Q2 Hou 50 john 25 40 100 dev
3 Q2 Bea 1000 dev 30 45 2000 dev
我正在尝试检索与名为 dev
的用户相关的所有数据,并且我正在将dev
与Buser
和Ouser
进行比较,并且当至少Buser and Ouser
中的一个与用户dev
匹配时,我正在尝试返回Id Term and Location
,但如果用户dev
与Buser
匹配但不Ouser
我只返回Bvol,Bid,Buser
与Id, Term and Location
一起并Offer,Ovol and Ouser as NULL
如果找到与 Ouser
匹配项,则同样适用。
预期结果如下
Id Term Location Bvol Buser Bid Offer Ovol Ouser
1 Q1 Hou 100 dev 10 NUll NULL NULL
2 Q2 Hou NULL NULL NUll 40 100 dev
3 Q2 Bea 1000 dev 30 45 2000 dev
首先,如果任一Buser or Ouser
中存在匹配项,则在返回整行时使用以下查询
return db.BrokerOutrights.Where(b => b.BidBroker == 'dev'||
b.OfferBroker=='dev');
我可以知道实现先前指定要求的好方法吗?
它可能适用于联盟:
大致如下:
var bids = db.BrokerOutrights
.Where(b => b.BidBroker == 'dev')
.Select(b => new { Id = b.Id, Term = b.Term, Location = b.Location, Bvol = b.Bvol, Buser = b.Buser, Bid = b.Bid, Offer = (int?)null, Ovol = (int?)null, Ouser = (string)null });
var offers = db.BrokerOutrights
.Where(b => b.OfferBroker == 'dev')
.Select(b => new { Id = b.Id, Term = b.Term, Location = b.Location, Bvol = (int?)null, Buser = (string)null, Bid = (int?)null, Offer = b.Offer, Ovol = b.Ovol, Ouser = b.Ouser });
return bids.Union(offers).Select(x => new BrokerOutright { Id = x.Id .... }).ToList();
这个想法是创建两个投影到匿名类型的查询;其中两个匿名类型具有相同的签名,因此可以联合。
然后,您需要将联合查询投影回您的实体 (BrokerOutright) 并列出集合以运行查询。
原理很简单,你必须成长
select (x == 'dev') ? value : null;
这可以对每一列完成
db.BrokerOutrights.Where(b => b.Buser == 'dev'|| b.Ouser=='dev')
.Select(i => new
{
i.Id,
i.Term,
i.Location,
(i.Buser == 'dev') ? i.Bvol : null,
(i.Buser == 'dev') ? i.Buser : null,
(i.Buser == 'dev') ? i.Bid: null,
(i.Ouser == 'dev') ? i.Offer : null,
(i.Ouser == 'dev') ? i.Ovol : null,
(i.Ouser == 'dev') ? i.Ouser : null
};