根据 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 的用户相关的所有数据,并且我正在将devBuserOuser进行比较,并且当至少Buser and Ouser中的一个与用户dev匹配时,我正在尝试返回Id Term and Location,但如果用户devBuser匹配但不Ouser我只返回Bvol,Bid,BuserId, 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');

我可以知道实现先前指定要求的好方法吗?

根据 LINQ 中的 Where 条件使少数列为 NULL

它可能适用于联盟:

大致如下:

      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
};