[英]Linq inner join using Split
实际上,我正在使用2 tables
例如GREETING_TRANSACTIONS
和COUNTRIES
。
在COUNTRIES
表中,我维护着CountryShortCode
和CountryFullName
列表。
虽然发送Greetings
,我节省CountryCodes
中,
在分离的方式GREETING_TRANSACTIONS
。例如: IN,MY,CN
印度,马来西亚和中国。
现在我正在做的是:首先,我使用此查询获取GREETING_TRANSACTIONS
的列表
var Messages =
(
from u in obj.GREETING_TRANSACTIONS
orderby u.SENT_DATE descending
select new
{
u.ID,
u.COUNTRIES,
u.TITLE,
u.MESSAGE,
u.SENT_DATE,
u.GREETING_TYPE,
u.CATEGORY_NAME
}
).ToList();
然后获取每个项目并splitting
COUNTRIES
列,并使用CountryShortCode
获取相关的CountryFullName
并准备一个DataTable
并绑定到GridView
。
是否可以使用联接在单个查询中完成所有操作?
可能是这样的:
var Messages1 =
(
from u in obj.GREETING_TRANSACTIONS
join c in obj.COUNTRY_MASTER
on u.COUNTRIES.Split(',') equals c.COUNTRY_SHORTNAME
orderby u.SENT_DATE descending
select new
{
u.ID,
u.COUNTRIES,
u.TITLE,
u.MESSAGE,
u.SENT_DATE,
u.GREETING_TYPE,
u.CATEGORY_NAME,
c.COUNTRY_FULLNAME
}
).ToList();
我是Linq的新手,但发现这很困难。
是否可以通过使用逗号分隔的简码并生成全名来查询数据?
我需要使用子查询吗?
您遇到的问题是您无法对拆分执行联接查询。 您需要从中制作一个SelectMany
。
因此,鉴于国家/地区列表确实很小,那么简单的方法就是进行查找。
保持您的Messages
查询,然后执行以下操作:
var lookup = obj.COUNTRY_MASTER
.ToDictionary(x => x.COUNTRY_SHORTNAME, x => x.COUNTRY_FULLNAME);
var Messages1 =
(
from m in Messages
from c in m.COUNTRIES.Split(',')
where lookup.ContainsKey(c)
orderby m.SENT_DATE descending
select new
{
m.ID,
m.COUNTRIES,
m.TITLE,
m.MESSAGE,
m.SENT_DATE,
m.GREETING_TYPE,
m.CATEGORY_NAME,
COUNTRY_FULLNAME = lookup[c],
}
).ToList();
根据下面的评论:
var Messages1 =
(
from m in Messages
orderby m.SENT_DATE descending
select new
{
m.ID,
m.COUNTRIES,
m.TITLE,
m.MESSAGE,
m.SENT_DATE,
m.GREETING_TYPE,
m.CATEGORY_NAME,
COUNTRY_FULLNAME = String.Join(
", ",
m.COUNTRIES
.Split(',')
.Where(x => lookup.ContainsKey(x))
.Select(x => lookup[x])),
}
).ToList();
使用逗号分隔的列表作为数据字段不是一个好主意。 您需要一个额外的多对多表来链接GREETING_TRANSACTIONS
和COUNTRIES
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.