嗨,我有2个数据表(禁止列表,国家列表),两个都包含国家名称和鳕鱼列表cc和国家.我正在尝试进行查询,我可以从countrylist表中选择不在bannedlist表中的国家,以便创建第3个表.
有任何想法吗?
我对此并不太了解.
var ccList = ds.Tables[2].AsEnumerable();
var bannedCCList = ds.Tables[1].AsEnumerable();
var query = from r in ccList....
Run Code Online (Sandbox Code Playgroud)
..
在尝试之后
var bannedCCList = ds.Tables[1].AsEnumerable();
var query = from r in ccList where !bannedCCList.Any(b => b["cc"] == r["cc"])select r;
Run Code Online (Sandbox Code Playgroud)
我仍然得到相同的国家名单.被禁止的人没有被删除.这里有更多细节,以便解释更多.不知道我做错了什么
protected void BindCountryBan(string subd)
{
DataSet ds = new DataSet();
ds = new DB().CountryBan_GetSiteSettings();
BannedCountryListBox.DataSource = ds.Tables[1];
BannedCountryListBox.DataValueField = "cc";
BannedCountryListBox.DataTextField = "country";
BannedCountryListBox.DataBind();
//bind country list
var ccList = ds.Tables[2].AsEnumerable();
var bannedCCList = ds.Tables[1].AsEnumerable();
var query = from r in ccList where !bannedCCList.Any(b => b["cc"] == r["cc"])select r;
//var query = ccList.Except(bannedCCList);
//CountryListBox.DataSource = ds.Tables[2];
DataTable boundTable = query.CopyToDataTable<DataRow>();
CountryListBox.DataSource = boundTable;
CountryListBox.DataValueField = "cc";
CountryListBox.DataTextField = "country";
CountryListBox.DataBind();
}
Run Code Online (Sandbox Code Playgroud)
如果您在国家/地区的序列中使用它,则会起作用:
using System.Linq;
...
var ccList = from c in ds.Tables[2].AsEnumerable()
select c.Field<string>("Country");
var bannedCCList = from c in ds.Tables[1].AsEnumerable()
select c.Field<string>("Country");
var exceptBanned = ccList.Except(bannedCCList);
Run Code Online (Sandbox Code Playgroud)
如果您需要未禁止国家/地区的完整行,您可以尝试左外连接:
var ccList = ds.Tables[2].AsEnumerable();
var bannedCCList = ds.Tables[1].AsEnumerable();
var exceptBanned = from c in ccList
join b in bannedCCList
on c.Field<string>("Country") equals b.Field<string>("Country") into j
from x in j.DefaultIfEmpty()
where x == null
select c;
Run Code Online (Sandbox Code Playgroud)
您可以使用Except()LINQ扩展方法,如下所示:
var result = full.Except(banned);
Run Code Online (Sandbox Code Playgroud)
但是,这将适用于包含类型的默认比较器.因此,如果您想使用示例中的特定列,则可能需要另一种方法,例如:
from r in ccList
where !bannedCCList.Any(b => b["cc"] == r["cc"])
select r;
Run Code Online (Sandbox Code Playgroud)
使用Except()意味着两个集合中的引用都是相同的,我认为不是表格的情况,或者如果我错了就纠正我.
归档时间: |
|
查看次数: |
15277 次 |
最近记录: |